2013-03-14 139 views
1

我有一個300x300的矩陣。我需要製作一個300x300x1024的矩陣,其中每個「切片」是原始的300x300矩陣。有沒有辦法做到這一點沒有循環?我試過以下內容:二維矩陣到一個3d矩陣而不使用循環

old = G;

for j=2:N; 

    G(:,:,j)=old; 

end 

其中N是1024,但內存不足。

知道任何較短的路線?

回答

-1

快速回答是否定的,您需要循環。

你可能可以做一些聰明的事情,比如塊複製你的數組的內存,但是你甚至沒有給我們一種語言來處理。

如果你正在存儲一個64位的值,我們幾乎要演出,你可能會想要確保矩陣中的每個條目都是最小尺寸,即使在字節矩陣大小下,也需要92mb。如果這是一個對象,你的號碼將立即跳入多個範圍。位打包可能會派上用場......但是再次不知道你的其他約束是什麼。

編輯:我更新了你的標籤。

我不確定我是否可以提供很多幫助,但雙打每個都是64位,所以在最低限度上,你正在談論2GB(如果你在32位系統上,你已經不可能實現)。如果每個單元格包含一個或兩個指向不同內存位置的指針(我不太瞭解matlab以確切地告訴您),那麼這可能會輕鬆地加倍。

如果你不是在8GB 64位機上運行,​​我認爲你沒有機會。如果你是,分配所有的內存,你可以matlab和祈禱。

對不起,我不能有更多的幫助,也許別人知道更多的技巧。

+0

啊對不起,我忘了提及它是matlab。它是高斯脈衝的數據,所以沒有obj,只是雙倍。但仍然,快速起牀 – Matthew 2013-03-14 19:27:44

4

使用repmat

B = repmat(A,[m n p...]) 

產生A的拷貝組成的多維數組B B的大小爲[大小(A,1)* M,尺寸(A,2)* n個,尺寸(A,3)* P ,...]。

在你的情況,

G=repmat(old,[1 1 1024]); 

會產生你不想要的for循環的結果。記憶問題是一個完全不同的主題。一個300x300x1024的雙矩陣將「花費」你〜740 MB的內存,這些日子並不多。在嘗試repmat之前檢查你的內存負載,看看爲什麼你沒有這些額外的700 MB。使用memorywhos來查看可用內存和可以清除哪些變量。

0

由於您未預先初始化您的矩陣,因此可能內存不足。

如果你這樣做第一,

old = G; 
G = zeros(size(old,1), size(old,2), 1024); 

,然後開始從1而不是2循環,你可能不會出現內存不足的

爲什麼這個工作是因爲你先拋開足夠整個矩陣的內存塊。如果你不初始化矩陣,matlab首先爲300x300x1矩陣留出足夠的內存空間。接下來,當您添加第二個切片時,它會向下移動內存,併爲300x300x2矩陣分配一個新塊,等等,永遠不能訪問爲第一個矩陣分配的內存。

這經常發生在matlab中,所以重要的是永遠不要在循環內增長矩陣。