我正在尝试编写一个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运算符错误。提前谢谢!
答案 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函数仅在一个维度上工作。)