2012-06-11 92 views
0

我的數據是一個2096x252矩陣的double值。我需要一個for循環或執行以下操作的等效項:
每次矩陣被重現時,第一個數組被刪除,第二個數組成爲第一個。當循環再次運行時,剩餘的矩陣被再現,並且第一個數組被刪除,並且下一個變成第一個,依此類推。 我嘗試過使用repmat,但處理大型矩陣(2096x252)時太慢且乏味。matlab for循環:最快,最有效的方法來重現大矩陣

例輸入:

1 2 3 4 
3 4 5 6 
3 5 7 5 
9 6 3 2 

所需的輸出:

1 2 3 4 
3 4 5 6 
3 5 7 5 
9 6 3 2 
3 4 5 6 
3 5 7 5 
9 6 3 2 
3 5 7 5 
9 6 3 2 
9 6 3 2 
+1

如果我正確理解你的問題,你的最終矩陣將是'2197656 x 252'的大小,我認爲這將超過4.4GB的大小。你確定內存不是限制因素,而不是算法的速度? –

+0

如果內存是一個限制因素,那麼你是否可以容納代碼來拼接和切分數據,所以這不成問題。 – Buntalan

回答

1

免責聲明:
你可能有大矩陣內存問題,但這不是問題。

現在,對業務:
對於給定矩陣A,與for循環的簡單方法是:

[N, M] = size(A); 
B = zeros(sum(1:N), M); 
offset = 1; 
for i = 1:N 
    B(offset:offset + N - i, :) = A(i:end, :); 
    offset = offset + size(A(i:end, :), 1); 
end 

B是所需的輸出矩陣。
但是,由於for循環,此解決方案預計也會變慢。

編輯:預分配B而不是動態更改大小(此優化應該實現輕微的加速)。

+0

我認爲你太謙虛了,如果最終矩陣和OP表示的一樣大,預分配B可能會實現巨大的加速。 –

+1

@HighPerformanceMark,我還沒有測試它的大矩陣,所以我只能猜測... –

+1

@eitanT。感謝它的工作!有沒有其他更有效的替代方案而不是for循環? – Buntalan

2

一般來說,使用Matlab預分配大型數組要比增量式構建要快得多。當你事先知道大陣的最終尺寸時,沒有理由不遵循這個一般性建議。

像下面這樣的東西應該做你想做的。假設你有一個數組in(nrows, ncols);那麼

indices = [0 nrows:-1:1]; 
out = zeros(sum(indices),ncols); 
for ix = 1:nrows 
    out(1+sum(indices(1:ix)):sum(indices(1:ix+1)),:) = in(ix:end,:); 
end 

這對您的小測試輸入有效。我希望你能弄清楚發生了什麼。

無論是我不知道的所有可能的方法中最快的方法,但我希望它比增量式構建大矩陣要快得多。

+0

我想你可以通過在循環之前計算'cumsum(indices)'來避免每次迭代調用'sum',並且在每次迭代中從預先計算的'cumsum'向量中選擇下一個元素。 –

+0

@EitanT:是的,你確實可以做到這一點。 –

+0

我很抱歉。我仍然是matlab的新手。我在執行代碼時不成功。你能再詳細一點嗎?謝謝。 – Buntalan