Vectorize循环涉及MATLAB中的矩阵值更新

时间:2013-04-18 20:07:04

标签: performance matlab for-loop dependencies vectorization

for循环如下:

N = 2;T = 3;
Trials = rand(N,T);
for i=1:N
    for j=1:T
        AverageValue = mean2(Trials);
        Trials(i,j) = Trials(i,j) - AverageValue;
    end
end   

难点在于AverageValue根据每个更新的Trials更改其值。

===========================================

使用' mean2'更新版本替换为' trapz'

N=4;T=5;
Trials=rand(N,T);
for i=1:N
    for j=1:T
        IntValue=trapz(trapz(Trials(1:3,2:5)));
        Trials(i,j)=Trials(i,j)+IntValue;
    end
end

请帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

以下代码将生成与帖子中示例相同的输出:

 n = numel(Trials);
 Trials = Trials - mean2(Trials)*reshape(((n-1)/n).^(0:n-1), T, N)';

解释:通过观察递归减法所产生的模式,您可以得到每个当前均值m形式的关系:

 m(k) = m(k-1) - m(k-1)/n = ((n-1)/n)*m(k-1); % symbolic

因此,您可以使用嵌入式递归直接从原始矩阵中减去矩阵,即

[m(1) m(2) m(3);
 m(4) m(5) m(6)];

其中每个m根据规则m(k)= (((n-1)/n)^(k-1)*)m(1);使用先前值的累积进行分析替换,其中m(1)是原始矩阵的平均值。