【问题标题】:Apply array of functions to a matrix将函数数组应用于矩阵
【发布时间】:2013-07-14 16:54:19
【问题描述】:

我有一个矩阵M,其中的行按一列排序(比如说c),

M = sortrows(M,c)

我需要对矩阵的每一行应用一个函数,这个函数取决于用于排序的列c中的值。例如,如果列 c 是向量 [1 1 1 2 2 2 3 3 3 3 3]',我需要为第 1 到第 3 行调用 f1,用第 4 到第 6 行调用 f2,用第 7 到第 11 行作为参数调用f3

另外,我想调用每个函数,将c 列中包含相同值的所有行作为参数传递,以避免在行上使用太慢的循环。有没有(非常)快速的方法来做到这一点? (如果不需要对M 进行排序就更好了)。

谢谢。

我用一些代码来精确我的需要(M 在这里没有排序,因为它似乎没有必要):

function test  
M=zeros(4,2);  
c=2;  
M(1:2,2)=[3,6]';
M(3:5,2)=[1,3,1]';
M(6:10,2)=[3,6,1,6,3]';   

function res = f1(y1,y2)
res=[1,1,1];
end

function res = f3(y1,y2)
res=[2,2,2];
end

function res = f6(y1,y2)
res=[3,3,3];
end

我们有:

M =

 0     3
 0     6
 0     1
 0     3
 0     1
 0     3
 0     6
 0     1
 0     6
 0     3

现在每一行都将是函数 fi,i=1,...n 的参数,其中 i=c 列中的值,即上面的示例:

f3 将第 1,4,6,10 行作为参数,f1 将第 3,5,8 行作为参数,f6 将第 2,7 和 9 行作为参数。

如何在不使用循环的情况下做到这一点?

【问题讨论】:

    标签: matlab sorting vectorization


    【解决方案1】:

    M 的行无需排序。使用自定义函数尝试 accumarray

    F = {@f1, @f2, @f3}; %// Cell array of function handles
    result = accumarray(repmat(M(:, c), size(M, 2), 1), M(:), [], @(x)F{x(1, c)}(x));
    

    请注意,accumarray 将具有相同 c 值的行组转换为列向量,因此如果您的函数无法处理此问题,则必须将它们重新整形。为此,您可以在将其传递给accumarray 之前定义一组备用函数:

    g = @(x)reshape(x, [], size(M, 2));
    F = {@(x)f1(g(x)), @(x)f2(g(x)), @(x)f3(g(x))};
    

    【讨论】:

    • 我目前不在 MATLAB 附近进行测试,希望语法正确。
    • 谢谢,但我得到一个错误:()-indexing 必须出现在索引表达式的最后
    • 我忘了说,fi 必须返回一个向量,而不是一个标量。 accumarray 可以吗? PS我可以克隆该函数,以便每个克隆都返回向量的每个标量元素,但这意味着调用该函数的次数与向量的长度一样多,这很慢。
    • @Gilbert 是的,当我可以访问 MATLAB 时,我会以这种方式实现它。
    • @Gilbert 嗨——抱歉耽搁了——我还没有时间解决这个问题——我会尽力为今天晚些时候腾出时间。你没事吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多