Mathematica: как применить функцию к определенному столбцу таблицы
Я хотел бы применить функцию к определенному столбцу таблицы. Скажем i-м столбцу таблицы (m x n). На самом деле я просто хочу умножить все элементы в этом столбце со скаляром, но приложение общей функции тоже будет хорошо.
Вероятно, ему просто нужна команда Map или MapAt, возможно, в сочетании с Transpose для применения к строкам вместо столбцов, но я не могу понять правильный синтаксис для адресации всего столбца (или строки)..
Любые подсказки будут высоко оценены.
Ответы
Ответ 1
Например,
ranfunc=Function[{f,mat, n},Transpose[MapAt[f /@ # &, Transpose[mat], n]]]
применит f к каждому элементу 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
Ответ 2
Здесь таблица 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
Column 2 is 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
Ответ 3
Один универсальный подход заключается в использовании ReplacePart
Например, чтобы применить f к столбцу 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
(В отличие от первого метода все изменения в столбце 3 мата теперь изменены. Неясно, хотите ли вы изменить существующую таблицу или создать новую таблицу с изменениями, оставив оригинал неповрежденным)
Ответ 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}}
Ответ 5
Функция MapAt принимает следующую спецификацию детали:
MapAt[f, mat, {All, 3}]
применить 'f' к столбцу 3 вашей матрицы.