将函数数组应用于矩阵

时间:2013-07-14 16:54:20

标签: matlab sorting vectorization

我有一个矩阵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调用f3第7行到第11行作为参数。

另外,我想调用每个函数,其中包含作为参数传递的列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作为参数。

如果不使用循环,我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

无需对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))};