Mathematica: как применить функцию к определенному столбцу таблицы - PullRequest
15 голосов
/ 31 декабря 2010

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

Ответы [ 5 ]

17 голосов
/ 31 декабря 2010

Вот таблица 3х3:

<code>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]]:

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

Так что легко изменить только этот столбец:

<code>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
7 голосов
/ 31 декабря 2010

Один универсальный подход заключается в использовании 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 матрицы теперь изменены. Неясно, хотите ли вы изменить существующую таблицу или создать новую таблицу с изменениями, оставив исходную нетронутой)

6 голосов
/ 31 декабря 2010

Например,

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

5 голосов
/ 25 мая 2017

Функция MapAt принимает следующую спецификацию детали:

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

, чтобы применить 'f' к столбцу 3 вашей матрицы.

4 голосов
/ 05 августа 2015

Другое компактное решение, которое я нашел, использует 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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...