在mathematica中列出索引

5 wolfram-mathematica

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;]]; 
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是来自MATLAB背景,我讨厌for循环,上面的操作是matlab中一个简单的索引操作.我确信有一种更聪明的方法来实现这一目标,这是一种数学风格.有没有人有建议?

Chr*_*icz 5

您正在使用c或0中的元素替换S的元素,因此:

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]
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 4

这比迄今为止发布的速度要快:

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]
Run Code Online (Sandbox Code Playgroud)

  • +1 表示 Replace 及其最后一个参数。不确定 Dispatch 是否有意义。取决于列表的长度。 (2认同)
  • 只是为了进一步澄清“Replace[ ]”中的第三个参数:“Replace[{1,1},_-&gt;2]”返回“2”,而“Replace[{1,1},_-&gt;2,1” ]` 返回“{2,2}”。这是因为在第一种情况下整个列表匹配,而在第二种情况下匹配在列表元素上。 (2认同)