Вы можете применить функцию к каждому элементу в векторе, например, сказав v + 1
, или вы можете использовать функцию arrayfun
. Как я могу сделать это для каждой строки / столбца матрицы без использования цикла for?
источник
Вы можете применить функцию к каждому элементу в векторе, например, сказав v + 1
, или вы можете использовать функцию arrayfun
. Как я могу сделать это для каждой строки / столбца матрицы без использования цикла for?
Многие встроенные операции, такие как sum
и prod
, уже могут работать со строками или столбцами, поэтому вы можете реорганизовать функцию, которую применяете, чтобы воспользоваться этим.
Если это не жизнеспособный вариант, один из способов сделать это - собрать строки или столбцы в ячейки с помощью mat2cell
или num2cell
, а затем использовать cellfun
для работы с результирующим массивом ячеек.
В качестве примера предположим, что вы хотите просуммировать столбцы матрицы M
. Вы можете сделать это, просто используя sum
:
M = magic(10); %# A 10-by-10 matrix
columnSums = sum(M, 1); %# A 1-by-10 vector of sums for each column
А вот как это сделать, используя более сложную опцию num2cell
/ cellfun
:
M = magic(10); %# A 10-by-10 matrix
C = num2cell(M, 1); %# Collect the columns into cells
columnSums = cellfun(@sum, C); %# A 1-by-10 vector of sums for each cell
true = false
Я уверен, что на языке, где есть допустимое утверждение, вы могли бы это сделать (:sum(M, 1)
. Новички могут подумать, чтоsum
можно использовать этот способ для матриц произвольного размера, а затем запутаются, когда матрица однажды станет такой же1-by-n
.Возможно, вам понадобится более непонятная функция Matlab bsxfun . Из документации Matlab, bsxfun «применяет бинарную операцию поэлементно, заданную дескриптором функции fun, к массивам A и B с включенным расширением синглтона».
@gnovice заявил выше, что сумма и другие базовые функции уже работают с первым не одноэлементным измерением (то есть, строки, если есть более одной строки, столбцы, если есть только одна строка, или более высокие измерения, если все более низкие измерения имеют размер == 1 ). Однако bsxfun работает с любыми функциями, включая (и особенно) пользовательские функции.
Например, предположим, что у вас есть матрица A и вектор-строка BEg, скажем:
Вам нужна функция power_by_col, которая возвращает в векторе C все элементы в A в степени соответствующего столбца B.
В приведенном выше примере C представляет собой матрицу 3x3:
т.е.
Вы можете сделать это методом грубой силы, используя repmat:
Или вы можете сделать это классным способом, используя bsxfun, который внутренне заботится о шаге repmat:
Таким образом, bsxfun сэкономит вам несколько шагов (вам не нужно явно рассчитывать размеры A). Однако в некоторых моих неофициальных тестах оказалось, что repmat примерно в два раза быстрее, если функция, которую нужно применить (например, моя функция мощности, выше), проста. Поэтому вам нужно выбрать, хотите ли вы простоты или скорости.
источник
Я не могу прокомментировать, насколько это эффективно, но вот решение:
источник
Основываясь на ответе Алекса , вот более общая функция:
Вот сравнение двух функций:
источник
Для полноты / интереса я хотел бы добавить, что в Matlab есть функция, которая позволяет вам работать с данными для каждой строки, а не для каждого элемента. Он называется
rowfun
( http://www.mathworks.se/help/matlab/ref/rowfun.html ), но единственная «проблема» в том, что он работает с таблицами ( http://www.mathworks.se/help/ matlab / ref / table.html ), а не матрицы .источник
В дополнение к эволюционирующему характеру ответа на этот вопрос, начиная с r2016b, MATLAB будет неявно расширять одноэлементные измерения, устраняя необходимость
bsxfun
во многих случаях.Из примечаний к выпуску r2016b :
источник
Ни один из приведенных выше ответов не работал для меня «из коробки», однако работает следующая функция, полученная путем копирования идей других ответов:
Он принимает функцию
f
и применяет ее к каждому столбцу матрицыM
.Так например:
источник
В последних версиях Matlab вы можете использовать структуру данных Table в своих интересах. Есть даже операция rowfun, но мне было проще сделать это:
или вот более старый, который у меня был, для старых версий Matlab не требуются таблицы.
источник
Принятый ответ, похоже, состоит в том, чтобы сначала преобразовать в ячейки, а затем использовать
cellfun
для работы со всеми ячейками. Я не знаю конкретного приложения, но в целом я думаю, что использованиеbsxfun
для работы с матрицей будет более эффективным. В основномbsxfun
применяет поэлементную операцию к двум массивам. Итак, если вы хотите умножить каждый элемент вn x 1
векторе на каждый элемент вm x 1
векторе, чтобы получитьn x m
массив, вы можете использовать:Это даст вам матрицу с именем, в
result
которой запись (i, j) будет i-м элементом,vec1
умноженным на j-й элементvec2
.Вы можете использовать
bsxfun
для всех видов встроенных функций, а можете объявить свои собственные. В документации есть список многих встроенных функций, но в основном вы можете назвать любую функцию, которая принимает два массива (вектор или матрицу) в качестве аргументов, и заставить ее работать.источник
Наткнулся на этот вопрос / ответ, пытаясь вычислить суммы строк матрицы.
Я просто хотел бы добавить, что функция SUM в Matlab фактически поддерживает суммирование для заданного измерения, то есть стандартной матрицы с двумя измерениями.
Итак, чтобы вычислить суммы столбцов, выполните:
а для сумм строк просто выполните
Держу пари, что это быстрее, чем программирование цикла for и преобразование в ячейки :)
Все это можно найти в справке по Matlab для SUM.
источник
если вы знаете длину своих строк, вы можете сделать что-то вроде этого:
источник