【问题标题】:Vectorize loop that involves matrix value updates in MATLAB在 MATLAB 中涉及矩阵值更新的向量化循环
【发布时间】:2013-04-18 20:07:04
【问题描述】:

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

请帮忙,谢谢!

【问题讨论】:

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

标签: performance matlab for-loop dependencies vectorization


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的回答。有用。我想知道这个原理是否可以应用于除mean2之外的其他函数,例如'Trials'的积分函数?
  • @huynhkhactuan 递归原理将起作用,只要您可以这样制定/编写您的函数。
  • 亲爱的 gevang,我更新了代码,将 'mean2' 替换为 'trapz'。我很了解原理,但我无法为更新版本建立递归关系。你能帮我把它矢量化吗?非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
相关资源
最近更新 更多