我想使用testread()
将csv文件加载到Matlab,因为其中的数据有超过200万条记录,所以我应该预先为这些数据分配数组。
假设我无法知道数组的确切长度,MATLAB v6.5的文档建议我使用repmat()
来扩展数组。文档中的原始文字如下:
"如果您无法预先分配,请查看是否可以增加 使用repmat函数的数组大小。 repmat试图找到你 一个连续的内存块,用于扩展阵列"。
我真的不知道如何使用repmat进行扩展?
是否通过估算repmat()
预分配的粗略长度来表示,然后删除空元素?
如果是这样,与使用zeros()
或cell()
进行预分配有何不同?
答案 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
是的,在收集完所有元素后,您可以调整数组大小以删除最后的空元素。