簡體   English   中英

為什么要使用repmat()擴展數組?

[英]Why using repmat() for expanding array?

我想使用testread()將csv文件加載到Matlab,因為其中的數據具有超過200萬條記錄,所以我應該為這些數據預分配數組。

假設我不知道數組的確切長度,MATLAB v6.5的文檔建議我對擴展數組使用repmat() 該文檔中的原始文字如下:

“在無法預分配的情況下,請查看是否可以使用repmat函數來增加陣列的大小。repmat會嘗試為擴展的陣列獲取連續的內存塊。”

我真的不知道如何使用repmat進行擴展?

這是否意味着通過估計repmat()進行預分配的長度的粗略數,然后刪除空元素?

如果是這樣,這與使用zeros()cell()預分配有何不同?

該文檔還說:

當您預先分配一個內存塊以容納除double以外的某種類型的矩陣時,這樣做會提高內存效率,有時使用repmat函數會更快。

下面的語句使用零來預分配uint8的100 x 100矩陣。 為此,它首先創建一個完整的double矩陣,然后將該矩陣轉換為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

是的,在收集完所有元素之后,您可以調整數組的大小以最后刪除空元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM