jan*_*048 15 wolfram-mathematica
我想将一个函数应用于表的特定列.对(mxn)表的第i列说.实际上我只想用该标量将该列中的所有元素相乘,但一般函数的应用也可以.
它可能只需要一些Map或MapAt命令,可能与Transpose结合使用以应用于行而不是列 - 但我无法找出用于寻址整个列(或行)的正确语法.
任何提示都将受到高度赞赏.
Bil*_*ite 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
一种通用的方法是使用ReplacePart
例如,要将f应用于mat的第3列:
(mat = Array[Subscript[a, ##] &, {4, 4}]) // MatrixForm
(newmat = ReplacePart[#, 3 -> f @#[[3]] ] & /@ mat) // MatrixForm
Run Code Online (Sandbox Code Playgroud)
以下将每个条目乘以10:
(newmat2 = ReplacePart[#, 3 -> 10 #[[3]] ] & /@ mat) // MatrixForm
Run Code Online (Sandbox Code Playgroud)
但是,"快速"的方法如下:
mat[[All, 3 ]] *= 10
Run Code Online (Sandbox Code Playgroud)
(不像第一种方法,在垫子的3列中的所有条目现在修改.目前尚不清楚是否要修改现有的表,或创建与修改的新表,离开原来的不变)
例如,
ranfunc=Function[{f,mat, n},Transpose[MapAt[f /@ # &, Transpose[mat], n]]]
Run Code Online (Sandbox Code Playgroud)
将f应用于第n列mat的每个元素.所以,例如,
ranfunc[Sin[Cos[#]] &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}}, 2]
Run Code Online (Sandbox Code Playgroud)
将Sin [Cos [#]]&应用于第二列的每个元素
ranfunc[s*# &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}},2]
Run Code Online (Sandbox Code Playgroud)
将第二列上的每个元素乘以s
小智 5
MapAt函数接受以下部件规范:
MapAt[f, mat, {All, 3}]
Run Code Online (Sandbox Code Playgroud)
将'f'应用于矩阵的第3列.