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

Wolfram mathematica Mathematica:如何将函数应用于表的某一列,wolfram-mathematica,Wolfram Mathematica,我想将函数应用于表的特定列。假设是(m x n)表的第i列。实际上,我只想用一个标量乘以该列中的所有元素,但是应用一般函数也可以 它可能只需要一些Map或MapAt命令,或者结合一个转置,以便应用于行而不是列-但是我无法找出寻址整个列(或行)的正确语法 任何提示都将不胜感激。例如 ranfunc=Function[{f,mat, n},Transpose[MapAt[f /@ # &, Transpose[mat], n]]] 将f应用于mat第n列的每个元素。那么比如说, ranfu

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

它可能只需要一些Map或MapAt命令,或者结合一个转置,以便应用于行而不是列-但是我无法找出寻址整个列(或行)的正确语法

任何提示都将不胜感激。

例如

ranfunc=Function[{f,mat, n},Transpose[MapAt[f /@ # &, Transpose[mat], n]]]
将f应用于mat第n列的每个元素。那么比如说,

ranfunc[Sin[Cos[#]] &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}}, 2]
将Sin[Cos[#]]应用于第二列的每个元素,而

ranfunc[s*# &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}},2]
将第二列上的每个元素乘以s

这是一个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

因此,只需修改该列即可:
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
[4]中的
table[[All,2]]=10*table[[All,2]]
Out[4]={20,50,80}
在[5]:=table//TableForm中
Out[5]//TableForm=1203
4   50   6
7   80   9

一种通用方法是使用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列中的所有条目现在都已修改。不清楚您是要修改现有表格,还是要创建一个经过修改的新表格,保持原始表格不变)

我发现的另一个精简解决方案是使用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}}

MapAt功能接受以下零件规格:

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

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

是的,这很有效。谢谢我在自己的尝试中丢失了MapAt中的嵌套映射(/@)。顺便说一句:如果一个人刚好在第2列(共3列)的乘法之后,那么矩阵乘法a.对角矩阵[{1,s,1}]也会起作用。但是你的解决方案更优雅、更灵活。+1,我绝对喜欢使用
ReplacePart
,而不是
MapAt
实现,因为这需要使用转置才能有效。更好的问题是优雅、可读,并且可以与内联代码一起使用,例如,在打印列表之前操作列表时,就像将x列乘以2一样:ListPlot[Map[MapAt[Function[x,2x],#,1]&,list]]多亏了你,我发现了
MapAt
!但是,甚至不需要
Map
包装器,您可以直接编写
MapAt[f,mat,{All,2}]
。另一种优雅的方法类似于C:table[[All,2]]*=10中的累积函数
MapAt[f, mat, {All, 3}]