我有一个矩阵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作为参数。
如果不使用循环,我怎么能这样做?
答案 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))};