2013-07-14 113 views
0

我有一个列排序列的矩阵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作为参数。

我该怎么做,而不使用循环?

回答

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))}; 
+0

我不是MATLAB附近的时刻对此进行测试,我希望我的语法正确。 –

+0

谢谢,但我得到一个错误:()-indexing必须出现在索引表达式的最后 – Gilbert

+0

我忘了提及,fi必须返回一个向量,而不是标量。准确评论可能吗? P.S我可以克隆该函数,以便每个克隆都可以返回该向量的每个标量元素,但这意味着将该函数调用的次数与向量的长度一样多,速度很慢。 – Gilbert