【问题标题】:Avoiding for loop in Matlab在 Matlab 中避免 for 循环
【发布时间】:2018-03-15 16:38:59
【问题描述】:

有什么方法可以避免在 Matlab 中使用下面的 for 循环? 'M' 和 'B' 是 100 x 100 对称矩阵,它的元素是已知的。

 p1=rand(100,100).*25;
 M=p1+p1';
 p2=rand(100,100).*25;
 B=p2+p2';
 dr=0.2;
 R=2 *dr;
 for o=1:50 
 center= R*o; 
 MX= abs(M-center)<dr; 
 mm=MX.*B; 
 countB = [countm,sum(mm(:))/sum(mm(:)~=0)];
 count = [count,sum(MX(:))]; 
 end

*这个for循环在另一个循环中重复,避免使用它的目的是使代码更快。

【问题讨论】:

  • count 需要是什么?您能否为MB 添加一个小样本以便我们运行它?
  • 是的,我做到了。 @10a
  • countmcount 在您在循环中分配它们之前都不存在,因此此代码将出错。另外:DON'T 增加数组,相反,只需预先分配它们,你所有的麻烦可能都会消失,因为这很可能是让这段代码变慢的原因。自 R2016b 以来,循环不再像以前那样糟糕,TMW 的最新发展使其几乎可以与矢量化相媲美。
  • 感谢您的评论 +1 @Adriaan

标签: matlab for-loop optimization


【解决方案1】:
o = permute(1:50, [1,3,2]); % [  1 x   1 x 50]
center = R*o;               % [  1 x   1 x 50]
MX = abs(M-center)<dr;      % [100 x 100 x 50]
mm = MX.*B;                 % [100 x 100 x 50]

MX = reshape(MX, numel(M), numel(center)); % [100000 x 50]
mm = reshape(mm, numel(M), numel(center)); % [100000 x 50]

countB = sum(mm,1)./sum(mm==1); % [1 x 50]
count = sum(MX,1);              % [1 x 50]

【讨论】:

  • 尝试一下,只有这样您才知道什么最适合您的具体情况。我认为矢量化方法应该更快。
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多