Подтвердить что ты не робот

Mathematica: как применить функцию к определенному столбцу таблицы

Я хотел бы применить функцию к определенному столбцу таблицы. Скажем i-м столбцу таблицы (m x n). На самом деле я просто хочу умножить все элементы в этом столбце со скаляром, но приложение общей функции тоже будет хорошо.

Вероятно, ему просто нужна команда Map или MapAt, возможно, в сочетании с Transpose для применения к строкам вместо столбцов, но я не могу понять правильный синтаксис для адресации всего столбца (или строки)..

Любые подсказки будут высоко оценены.

4b9b3361

Ответ 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 вашей матрицы.