【问题标题】:Consider preallocating for speed [duplicate]考虑预分配速度[重复]
【发布时间】:2011-01-10 05:35:51
【问题描述】:

我正在做以下事情

for i = 1:m,
    index = 0;
    for j = 1:n,
        index = index+values(i,j)*2^(j-1);
        if (j==1)
            symbol_chip = chip_values(index+1,:);
        else
            symbol_chip = [symbol_chip chip_values(index+1,:)];
        end
    end
end

它告诉我以下内容:

symbol_chip 可能在循环内增长。考虑预分配速度。

有什么想法吗?

【问题讨论】:

  • 为了避免重复,在一个相关问题中:stackoverflow.com/questions/1548116/…,我展示了一种通过预分配内存来提高性能的方法,同时通过在需要时添加更多内存空间来提高空间效率跨度>
  • 你试过 Matlab 帮助吗???只需在任何 Matlab 窗口中按 F1,在搜索编辑字段中键入“预分配”,然后按 ENTER。你会得到你所需要的!!!

标签: matlab memory-management


【解决方案1】:

如果你有一个在循环内增长而没有被预分配的变量,M-Lint 会抛出这个警告。您可以通过预先分配集合变量来消除此错误。

例如,如果您知道变量 symbol_chip 最多有 i*j 个元素,您可以使用以下语句预分配它:

symbol_chip = zeros(i*j);

但是,对于大多数应用程序而言,预分配对算法性能的影响可以忽略不计。如果您正在处理非常大的数据集,我只会担心它。

【讨论】:

  • zeros(ij) 将创建一个包含 ij 行和 ij 列的二维数组。要解决此问题,请使用 zeros(ij,1)
【解决方案2】:

是的。每次您四处走动时,您的elseif 块都会调整symbol_chip 的大小,这很昂贵。相反,重写你的代码,以便在循环之前有(比如)symbol_chip = zeros(max_size, 1);。然后,更改内容,但不要更改symbol_chip 的大小。

你需要稍微改变你的方法,但如果你这样做会更快。如果您对当前的速度不感到厌烦,请不要更改任何内容!

【讨论】:

  • 对不起,我更正了它应该是 else 而不是 elseif
  • 假设在外部 for 循环之前我放了 symbol_chip = zeros(m*32,1);那么我将如何更改我的 if-else 语句?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
相关资源
最近更新 更多