2015-10-08 75 views
0

我想加载一个csv文件到Matlab使用testread(),因为其中的数据有200多万条记录,所以我应该为这些数据预先分配数组。为什么使用repmat()扩展数组?

假设我不知道数组的确切长度,MATLAB v6.5的文档建议我使用repmat()来扩展数组。在doc原话是如下:

“在你不能预分配,看看你是否可以使用repmat功能增加 大小的数组的情况下repmat试图让你 一个连续的内存块为您的扩展阵列“。

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

是否通过估计长度repmat()到预分配的粗略平均数目,然后取出空元素?

如果是这样,那么与预先分配使用zeros()还是cell()有什么不同?

回答

3

的文件也说:

当你预分配一块内存来保存一些类型 一倍以上其他的矩阵,它是更多的内存效率,有时甚至更快 使用repmat功能此。下面

该语句使用零来预分配 UINT8的100逐100矩阵。它首先创建一个完整的双打矩阵,然后将矩阵转换为uint8。这花费时间并且不必要地使用存储器 。

A = int8(zeros(100)); 

使用repmat,您只创建一个双层,从而减少你的记忆 需求。

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

因此,其优点是,如果你想增加一倍以外的数据类型,你可以使用repmat复制非双数据类型。

另见:http://undocumentedmatlab.com/blog/preallocation-performance,这表明:的

data1(1000,3000) = 0 

代替:

data1 = zeros(1000,3000) 

,以避免其他元素的初始化。

至于动态调整大小,repmat可用于您的阵列的大小简洁两倍(这导致摊销ö的常用方法(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 

是的,后你已经收集了所有的元素,你可以调整数组的大小来删除最后的空元素。

+1

感谢您的详细和快速回复,这些链接也非常有帮助。 –