【问题标题】:Matlab HOF to apply a function to every row of a matrixMatlab HOF将函数应用于矩阵的每一行
【发布时间】:2018-06-11 23:06:02
【问题描述】:

我正在尝试编写一个 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 运算符错误。提前致谢!

【问题讨论】:

  • 有一个名为 rowfun 的函数,它适用于表格。

标签: matlab higher-order-functions


【解决方案1】:

您提供的代码存在一些问题。 第一个你的函数返回 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;

【讨论】:

    【解决方案2】:

    是的,您可以在 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 函数只能在一维上工作。)

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2011-05-13
      相关资源
      最近更新 更多