2013-04-18 159 views
1

矩阵值来更新for循环如下:矢量化循环,其涉及在MATLAB

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 

请帮帮忙,谢谢!

+0

感谢yuk回答!但'mean2'正是我想要的。这就是为什么每次迭代后“试验”矩阵都会改变...... –

回答

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)是原始矩阵的平均先前值的acummulation。

+0

非常感谢您的回答。有用。我想知道这个原理是否可以应用于除mean2之外的其他函数,例如“Trials”的整数函数? –

+0

@huynhkhactuan递归原则将起作用,只要你可以像这样编写/写入你的函数。 – gevang

+0

亲爱的gevang,我更新了'trap2'代替'mean2'的代码。我理解了这个原理,但我无法为更新后的版本建立递归关系。你能帮我把它矢量化吗?非常感谢。 –