2011-03-29 7 views
5

S은 고유 한 요소가있는 벡터이고, s은 고유 한 요소가 포함되어 있습니다. 예 : S={1,2,3,4,5,6}s={1,3,4,6}. S[[i]]s의 요소 인 경우, 지금은 벡터 C=[7,0,8,9,0,7]를 만드는 방법을 다른 벡터 c={7,8,9,7}을 부여 즉, 다음 C[[i]] 다른 sS[[i]] 제로와 동일한 인덱스 c의 요소와 동일하다. 이것은 작동하지만 MATLAB 배경에서 오는, 내가 for 루프를 미워하고 위의 작업이 MATLAB에서 사소한 인덱싱 작업입니다mathematica에서 목록 색인 생성

C=Array[0&,Length[S]]; 
j=1; 
For[i=1,i<=Length[S],i++,If[MemberQ[s,S[[i]]],C[[i]]=c[[j]];j=j+1;]]; 

처럼 내가 가진 무엇

지금 보인다. 이것을 달성하는 더 똑똑한 방법이 있다고 확신합니다. la mathematica 스타일. 누구 제안이 있습니까? 그래서 C 또는 0 인 요소 중 하나와 S의

+1

이 아래 답변에 관련되지 않고,'C = 배열 ​​더 나은 C = ConstantArray [0, 길이 '로 표현 [0 &, ...]'된다 [S]]'이며, 부팅하는 데 10 배 더 빠릅니다. –

답변

4

이 지금까지 게시 된 내용보다 빠른 :

ss = {1, 2, 3, 4, 5, 6}; s = {1, 3, 4, 6}; c = {7, 8, 9, 7}; 

Replace[ss, [email protected][Thread[s -> c], _ -> 0], 1] 
+1

Replace와 마지막 인수에 +1. 파견 여부가 확실하지 않습니다. 목록의 길이에 따라 다릅니다. –

+0

@Sjoerd 빠른 테스트는 짧은 목록에는 페널티가 거의없고 긴 목록으로는 훨씬 빠름을 나타냅니다. 왜 그것을 포함하지 않습니까? –

+0

@Wizard, 빠릅니다. 그 마지막 인자'1'이 무엇을 설명 할 수 있습니까? 나는 문서를 훑어 보았고 그것이 '레벨 스펙 (levelspec)'이라고 말했지만 설명 할 예제는 더 이상 없었다. 그걸 가지고 놀아 보면 0이 아닌 값이라면 같은 대답을주는 것처럼 보였습니다. –

5

교체하는 요소 :

ss = {1, 2, 3, 4, 5, 6} 
s = {1, 3, 4, 6} 
c = {7, 8, 9, 7} 
r = Append[MapThread[Rule, {s, c}], Rule[_, 0]] 
answer = Map[Replace[#, r] &, ss] 
1

여기서 하나의 방법이다. 아마도 다른 많은 것들이있을 것입니다.

s = {1, 2, 3, 4, 5, 6}; 
subS = {1, 3, 4, 6}; 
c = {7, 8, 9, 7}; 
d= s /. {x_Integer :> If[MemberQ[subS, x], c[[Position[subS, x][[1, 1]]]], 0]} 

나는 사용자 정의 기호로 일반적으로 사용되는 소문자 변수 이름을 사용했습니다.

Mathematica 사용 중괄호는 벡터,리스트, 행렬 및 테이블에 사용됩니다.

+0

@ d' o-o'b 원래 제안서에 약간의 수정을가했습니다. 실제로 케이스의 모든 단일 요소에 작용하고 있음을 깨닫고 '사례'를 삭제했습니다. – DavidC

1
ss = {1, 2, 3, 4, 5, 6}; 
s = {1, 3, 4, 6}; 
c = {7, 8, 9, 7}; 
ss /. Join[MapThread[Rule, {s, c}],Thread[Rule[Complement[ss, s], 0]]] 

편집 나 :

answer = 0 ss; answer[[Position[ss, #, 1] & /@ s // Flatten]] = c; 
1

S 경우 양식 {1, 2, ..., n}, (예를 들어, Range[n]의 항상)이 솔루션은 SparseArray을 사용하여 @Mr의 약 2 배 빠릅니다. 마법사의 매우 큰 목록 내 시험에서 답 :

Normal[SparseArray[Thread[s -> c], n, 0]] 
+0

'위치'를이 접근법에 통합 할 수 있습니까? – tomd

+0

'위치'란 무엇입니까? –

+0

subS가 ss의 정렬 된 하위 집합이지만 ss의 요소가 반드시 정렬되지는 않는 경우를 생각하고있었습니다. 아마도 OP는 그렇지 않다는 것을 의미할까요? 예를 들어 ssalt = {2, 4, 1, 5, 6, 3} 및 subSalt = {4, 1, 6, 3}이면 'Replace [ssalt, Dispatch @ Append [Thread [subSalt - c], _ -> 0], 1] == 정상 [SparseArray [Flatten @ Position [ssalt, #] 및/@ subSalt-> c], 6, 0]]'. (subS는 항상 정렬 된 하위 집합이라는 가정입니까?) – tomd