关于Mathematica中的列表和函数操作的三个问题

时间:2011-06-10 00:21:34

标签: wolfram-mathematica

我刚刚对列表和功能操作提出了一些问题。

1)如果我有一个函数f[]和一个列表list,我想按顺序将f[]应用于列表的每个元素,就像Scan一样,但不是MapApply,甚至是Nest。怎么做?

2)如果我有一个列表list和一个索引列表ind,如何在给定另一个值列表的情况下为相应的元素赋值? Map[list[[#]] &, ind] = value_list会出现Set::write: Tag Map in ... is Protected错误。

3)如何应用函数f[] n次并形成结果列表,而不是像函数n那样组合函数Nest次?是Map[f[],Range[n]]吗?

修改

在回应评论时,这里有一些简单的例子,涉及如何在列表中将指定索引的元素设置为零。这些例子用于说明目的。当然,必须有更好的选择来完成这些任务。在进入像setZeroWithIndex[list_, ind_] := Module[{}, list[[ind]] = ConstantArray[0, Length[ind]]; Return[list]];

这样的工作之前,我只是把它们弄累了

1)setZeroWithIndex[list_, ind_] := Scan[ReplacePart[list, # -> 0] &, ind];。这不起作用。用ScanMap等替换Apply也不起作用。

2)setZeroWithIndex[list_, ind_] := Map[list[[#]] &, ind] = ConstantArray[0, Length[ind]]; mylist = Range[20]; setZeroWithIndex[mylist, {2, 4, 6}]。得到了我发布的错误。

3)setZeroWithRandomIndex[list_] := ReplacePart[list, RandomInteger[{1,Length[list]}] -> 0]。现在我只想应用setZeroWithRandomIndex n次,而不是多次功能性地组合它。 NestList似乎无法在这里发挥作用。

1 个答案:

答案 0 :(得分:4)

ScanDo会做到这一点。试试Scan[f, list]Do[f@el, {el, list}]

关于2),您应该使用Part。例如,list[[{ind}]] = a将根据需要更改元素。如果a是与ind长度相同的向量,则会发生相应的线程。

3)你应该看看NestList