Matlab HOF将函数应用于矩阵的每一行

时间:2018-06-11 23:06:03

标签: matlab higher-order-functions

我正在尝试编写一个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 :(得分:0)

您提供的代码存在一些问题。 首先你的函数返回Z,所以你不能在函数的开头将它传递给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;

答案 1 :(得分:0)

是的,您可以在MATLAB中编写高阶函数。这需要function handles

使用@运算符创建函数句柄。例如,@mean是函数mean的句柄。您还可以创建anonymous functions(在其他语言中称为lambdas),它可以捕获变量。例如,

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函数仅在一个维度上工作。)