Matlab HOF для применения функции к каждой строке матрицы - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь написать функцию MATLAB, которая применяет функцию к каждой строке матрицы.Есть ли функция, которая делает это уже?Переполнение стека, похоже, ничего не дало.Если нет, вот функция, которую я пытаюсь написать:

function Z = rowMap(f,X)
[m n] = shape(Z);
Y = [];
for i = 1:m
  Y = [Y f(X(i,:))];
end
Z = Y;
end

Поддерживает ли MATLAB функции высшего порядка, подобные этой?Я получаю неожиданную ошибку оператора Matlab.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Да, вы можете писать функции высшего порядка в MATLAB.Для этого требуется дескрипторы функций .

Вы создаете дескриптор функции с помощью оператора @.Например, @mean является дескриптором функции mean.Вы также можете создавать анонимные функции (на других языках, называемых лямбдами), которые могут захватывать переменные.Например,

data = rand(50,1);
func = @(ii)mean(data.^ii);

создает дескриптор функции func, который можно передать функции, и содержит data.

Ваша функция rowMap может быть записана как

function Y = rowMap(f, X)
m = size(X, 1);
Y = zeros(m,1);
for i = 1:m
  Y(i) = f(X(i,:));
end

и вызываться с помощью

X = randn(50, 50);
Y = rowMap(@mean, X);

или, используя описанную выше функцию дескриптора func,

Y = rowMap(func, X);

(Обратите внимание, что это то же самоепри вызове Y = mean(X, 2) многие функции MATLAB работают только в одном измерении.)

0 голосов
/ 12 июня 2018

В указанном вами коде есть несколько ошибок.Сначала ваша функция возвращает Z, поэтому вы не можете передать ее в начале функции в функцию shape.Кроме того, я не уверен, что такое функция shape, поскольку она не является встроенной функцией MATLAB.Полагаю, вам нужна функция size.

У вас сложная схема индексации.Если элементы X не содержат значений, которые являются индексами элементов f, вы получите ошибку.Я переписал ваш код, применяя функцию MATLAB для каждой строки.

mat = [1 2 14 6 5 48 96 175;...
   1 2 5 6 7 45 65 45];
[m, n] = size(mat);
Y=[];
for i =1 :m
   Y = [Y,mean(mat(i,:))];
end
Z = Y;
...