为什么使用repmat()扩展数组?

时间:2015-10-08 09:01:43

标签: arrays performance matlab

我想使用testread()将csv文件加载到Matlab,因为其中的数据有超过200万条记录,所以我应该预先为这些数据分配数组。

假设我无法知道数组的确切长度,MATLAB v6.5的文档建议我使用repmat()来扩展数组。文档中的原始文字如下:

  

"如果您无法预先分配,请查看是否可以增加   使用repmat函数的数组大小。 repmat试图找到你   一个连续的内存块,用于扩展阵列"。

我真的不知道如何使用repmat进行扩展?

是否通过估算repmat()预分配的粗略长度来表示,然后删除空元素?

如果是这样,与使用zeros()cell()进行预分配有何不同?

1 个答案:

答案 0 :(得分:3)

文档还说:

  

预分配内存块以保存某种类型的矩阵时   除了双倍,它更有效,有时更快   为此使用repmat函数。

     

下面的语句使用零来预分配100×100的矩阵   UINT8。它通过首先创建一个完整的双打矩阵来实现这一点   然后将矩阵转换为uint8。这花费时间并使用记忆   不必要的。

A = int8(zeros(100));
     

使用repmat,只创建一个double,从而减少你的记忆   需要。

A = repmat(int8(0), 100, 100);

因此,优点是如果您需要双精度数据类型,则可以使用repmat复制非双精度数据类型。

另请参阅:http://undocumentedmatlab.com/blog/preallocation-performance,建议:

data1(1000,3000) = 0

而不是:

data1 = zeros(1000,3000)

避免初始化其他元素。

对于动态调整大小,repmat可以用来简洁地加倍数组的大小(一种常见的方法导致为每个元素追加摊销的O(1)):

data = [0];
i = 1;
while another element
    ...
    if i > numel(data)
      data = repmat(data,1,2); % doubles the size of data
    end
    data(i) = element
    i = i + 1;
end

是的,在收集完所有元素后,您可以调整数组大小以删除最后的空元素。