【问题标题】:Preallocation in MATLABMATLAB 中的预分配
【发布时间】:2018-12-08 12:19:17
【问题描述】:

问题

我有一个矩阵 M,如下所示:

   M =  [1, 1, 0, 1, 0, 0, 0;
         0, 1, 1, 0, 1, 0, 0;
         0, 0, 1, 1, 0, 1, 0;
         0, 0, 0, 1, 1, 0, 1;
         1, 0, 0, 0, 1, 1, 0;
         0, 1, 0, 0, 0, 1, 1;
         1, 0, 1, 0, 0, 0, 1];  

所有列的总数为21:

 Total_ones_in_cols = 21; 

然后我预分配内存以查找 M 中每一列的行索引:

row_indices = zeros(1,Total_ones_in_cols); 

下一步是查找所有列的行索引:

for i = 1:7
     Temp = find(M(:,i)); 
     row_indices = [row_indices, Temp.'];
end 

问题

尽管对 row_indices 进行了预分配,MATLAB 仍然建议在循环内预分配 row_indices 以提高速度。有人可以解释为什么会这样吗?我的猜测是,由于我在循环中不断更改 row_indices 的大小,因此我预分配的先前内存被覆盖并被丢弃,这本质上意味着我所做的预分配变得无用。

【问题讨论】:

    标签: matlab matrix vectorization indices pre-allocation


    【解决方案1】:

    您已经根据row_indices 的最终大小正确分配了内存,但是您没有将循环中的结果存储在预分配的索引处,而是将它们附加到最后。追加总是会终止预分配,因此 MATLAB 会告诉您进行预分配,因为循环结束时 row_indices 的大小是 [1 42] (MATLAB 假设您想要这个结果)而不是您预分配的 [1 21](和实际寻找)。

    要修复您的代码,应该是:

    row_indices = zeros(1,Total_ones_in_cols); 
    for ii = 1:7 %i is for imaginary numbers; don't use i (and j) as variable name(s)
         Temp = find(M(:,ii)); 
         row_indices(3*ii-2 : 3*ii) = Temp;  %Storing results at their specific indices
    end 
    %This assumes that you already know that there are 3 ones in each column
    

    我在您的问题中看到了 标签。请注意,find 直接适用于矩阵,因此您可以通过以下方式避免循环(您应该为这样的简单任务执行此操作):

    [row_indices, ~] = find(M);
    

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2019-01-29
      • 2013-08-19
      • 1970-01-01
      • 2013-07-25
      • 2012-12-31
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多