Индексирование списка в mathematica - PullRequest
5 голосов
/ 30 марта 2011

Пусть S - вектор с уникальными элементами, а s его подмножество, также с уникальными элементами;например, S={1,2,3,4,5,6} и s={1,3,4,6}.Теперь, учитывая еще один вектор c={7,8,9,7}, как я могу создать вектор C=[7,0,8,9,0,7], т. Е. Если S[[i]] является элементом в s, то C[[i]] равен элементу в c с тем же индексом, что иS[[i]] в s, иначе ноль.

То, что у меня сейчас есть, выглядит как

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;]]; 

Это работает, но, исходя из фона MATLAB, я ненавижу циклы for ивышеуказанная операция является тривиальной операцией индексации в matlab.Я уверен, что есть более разумный способ сделать это, в стиле la mathematica.У кого-нибудь есть предложения?

Ответы [ 5 ]

5 голосов
/ 30 марта 2011

Вы заменяете элементы S либо элементом в c, либо 0, поэтому:

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]
4 голосов
/ 30 марта 2011

Это быстрее, чем было опубликовано:

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

Replace[ss, Dispatch@Append[Thread[s -> c], _ -> 0], 1]
1 голос
/ 30 марта 2011

Если S всегда имеет форму {1, 2, ..., n} (например, Range[n]), тогда это решение с использованием SparseArray примерно в два раза быстрее, чем @Mr. Ответ мастера при тестировании очень больших списков:

Normal[SparseArray[Thread[s -> c], n, 0]]
1 голос
/ 30 марта 2011
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 голос
/ 30 марта 2011

Вот один из способов.Вероятно, есть много других.

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 использует фигурные скобки, которые используются для векторов, списков, матриц,и таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...