我正在創建一個網狀網格或陣列的組合向量。完整的組合向量非常大,以至于MATLAB提示我 "記憶體不足 "的錯誤。我寫了一段代碼來創建網格,這取決于變數 "Col".
。Col=9。
numMatrix = uint8([1 2 3]) 。
meshString=strcat("a3 = combvec("/span> ,repmat('numMatrix , ', 1, Col-1), "numMat ) ")
eval(meshString)。
如果Col值是9,那么形成的矩陣的大小是這樣的。
變數大小位元組
a3 9x19683 1417176 double
這段代碼的問題是,如果我的Col值是25,那么a3的大小將是25x3^25,這需要253^258/1024/1024 GB(1.5782e 05 GB)的記憶體,這是無法實作的。所以我想創建一個特定范圍的組合。例如,只直接擁有前50000個組合,然后在處理后再去找下一個50000個組合。
P.S:我還使用了[b1,b2....,b25]=ndgrid(1:3)的函式來創建b的網格,然后將其壓扁以形成組合。它也受到上面解釋的同樣問題的困擾。
uj5u.com熱心網友回復:
combvec的輸出是完全可預測的,所以與其生成整個向量,你可以簡單地單獨計算每個迭代。
讓我們舉一個簡單的例子:
% we compute combvec(1:3,1:3,1:3,1:3)
n = 4。
x = 1: 3;
x = repmat({x},n,1)
y = combvec(x{:})
這里y是一個4x81矩陣。我們注意到,如果我們只使用向量[1,2,3]的組合,那么j-th列將對應于j-1的基3。
因此,我們可以寫一個小函式,將一個十進制數字轉換為基數3:
function r = f(j。 n)
r = fliplr(dec2base(j-1,3,n)-47) 。%的小技巧,用-47隱含地將一個char轉換為其ascii值減去47。。
結束。
現在我們可以驗證平等性,例如j=10:
all(f(10,n) == y(:,10)
而我們確實得到了。True作為一個結果。
它也適用于多個值:
all(f(9:10,n) == y(:,9:10)
因此,你只需要添加combvec的最后一行,現在你可以分割你的操作,讓你的電腦運行一周。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326924.html
標籤:
