Mathematica:如何将函数应用于表的某一列

时间:2010-12-31 14:41:49

标签: wolfram-mathematica

我想将函数应用于表的特定列。对(m×n)表的第i列说。实际上我只想用该标量将该列中的所有元素相乘,但一般函数的应用也可以。

它可能只需要一些Map或MapAt命令,可能与Transpose结合使用以应用于行而不是列 - 但我无法找出用于寻址整个列(或行)的正确语法.. < / p>

任何提示都将受到高度赞赏。

5 个答案:

答案 0 :(得分:17)

这是一个3x3表:

In[1]:= table = {{1,2,3}, {4,5,6}, {7,8,9}}
Out[1]= {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
In[2]:= table//TableForm
Out[2]//TableForm= 1   2   3
                   4   5   6
                   7   8   9
第2列是table[[All, 2]]

In[3]:= table[[All, 2]]
Out[3]= {2, 5, 8}

因此,仅修改该列是一件简单的事情:

In[4]:= table[[All, 2]] = 10 * table[[All, 2]]
Out[4]= {20, 50, 80}
In[5]:= table//TableForm
Out[5]//TableForm= 1   20   3
                   4   50   6
                   7   80   9

答案 1 :(得分:7)

一种通用的方法是使用ReplacePart

例如,要将f应用于mat的第3列:

(mat = Array[Subscript[a, ##] &, {4, 4}]) // MatrixForm

(newmat = ReplacePart[#, 3 -> f  @#[[3]] ] & /@ mat) // MatrixForm

以下将每个条目乘以10:

(newmat2 = ReplacePart[#, 3 -> 10 #[[3]] ] & /@ mat) // MatrixForm

然而,“快速”的方法如下:

mat[[All, 3 ]] *= 10

(与第一种方法不同,mat的第3列中的所有条目现在都已修改。目前尚不清楚是要修改现有表,还是创建一个带有修改的新表,保留原始表)

答案 2 :(得分:6)

例如,

ranfunc=Function[{f,mat, n},Transpose[MapAt[f /@ # &, Transpose[mat], n]]]

将f应用于第n列mat的每个元素。所以,例如,

ranfunc[Sin[Cos[#]] &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}}, 2]

将适用Sin [Cos [#]]&amp;到第二列的每个元素,而

ranfunc[s*# &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}},2]

将第二列上的每个元素乘以s

答案 3 :(得分:5)

MapAt函数接受以下部件规范:

MapAt[f, mat, {All, 3}]

将'f'应用于矩阵的第3列。

答案 4 :(得分:4)

我找到的另一个紧凑型解决方案是使用Map和MapAt:

以下是矩阵示例:

mat={{3,4,5},{4,7,5},{2,6,7},{3,6,9}}

现在将函数f应用于第二列:

n=2;
Map[MapAt[f,#,n]&,mat]

结果是:

{{3,f[4],5},{4,f[7],5},{2,f[6],7},{3,f[6],9}}