0

给定矩阵中的多个信号,例如和具有多个标签m [T x N] 的分组变量g [ 1 x N ]L < N

是否有一种有效的就地方法来计算每个标签的平均时间信号?

一个 for 循环

ml = zeros (T,L)

for i = 1:T
    for j = 1:L
        ml(i,j) = mean ( m(i,find(g==j)) )
    end
end

是一种直接的方法,但是否有更快/更清洁的方法,可能使用矢量化代码?只是为了(a)摆脱 for 循环和(b)一次性分配m = labelled_means(m, ...)。我读过关于statarray,但这看起来甚至比这个 for 循环效率低得多。

4

3 回答 3

1

那么你可以很容易地摆脱你的外循环:

for j = 1:L
    ml(:,j) = mean(m(:,find(g==j)), 2)
end
于 2013-09-23T14:26:50.247 回答
1

您可以使用arrayfun. 它会更干净,不知道是否更快:

result = arrayfun(@(n) mean(A(:,find(g==n)),2),1:2,'UniformOutput',false);
result = reshape([result{:}],[],L)

例如,用数据

A = [1 2 3 4;
     5 6 7 8;
     9 10 11 12];
L = 2;
g = [1 1 2 2];

这给了

result =

    1.5000    3.5000
    5.5000    7.5000
    9.5000   11.5000
于 2013-09-23T14:32:55.223 回答
1

您可以使用accumarray

[X,Y] = ndgrid(1:size(A,1), g);
accumarray([X(:) Y(:)], A(:), [], @mean);
于 2013-09-23T18:06:15.433 回答