0

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

M = sortrows(M,c)

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

我怎么能不使用循环来做到这一点?

4

1 回答 1

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))};
于 2013-07-14T17:12:23.147 回答