Re: [問題] 產生所有[1~H 1~H 1~H .. 1~H]這些vector已回收
※ 引述《GSXSP (Gloria)》之銘言:
: : 假設你的各個 h 為一長度 5 的向量且每一個元素的範圍為 1~7,
: : 則生出那堆 h 向量的程式碼可寫成如下:
: : H = 1:7; % index range
: : n = 5; % number of digits
: : [X{n:-1:1}] = ndgrid(H);
: : X = reshape(cat(n+1, X{:}), [], n);
: : 跑完之後看你要拿第幾個 h。
: : 矩陣 X 中的第 k 個 row 就是生出來的第 k 個 h 向量。
: : 例如:X(3, :) <== 第三個 h 向量
: 這個方法好像沒辦法處理太大的耶
: 例如說
: H = 1:8; % index range
: n = 10; % number of digits
: 這樣好像就matrix過大了
: 不曉得有沒有辦法改善呢?
本來想轉當個潛水員了,不過這是之前回過的問題就回完整些囉~
就如先前所提到的,上一篇的方法是先產生出所有可能的 h,
將這堆 h 放在 X 矩陣中以供取用。
這樣的優點是產生速度快、程式碼簡短。
缺點則是因為 X 矩陣大小會是 (H^n)*n,隨著 n 的成長非常快,
所以如果你的 n 稍大,很容易就會放不進記憶體。
這時候只能利用迴圈的方式,也就是你最開始所提到的第二個方法,
在每次的迴圈中生出那次迴圈所需要用到的 h。
有鑒於你的 H 是 2 的次方,我目前能想到感覺比較好的方式是:
H = 2^3; % H = 8
n = 6; % number of digits
s = -3*(n-1):3:0; % shift places
for k = 0:H^n-1
h = bitand(bitshift(k, s), H-1) + 1;
% do something with h
end;
不過缺點就是慢,在我電腦上測的結果是,光跑過所有的 h 在 n=6 的情況下
就需要約 2 秒。大略估計一下,n=10 可能要 4~5 個小時吧...
(可以比較一下,同樣 H=8, n=6 用上一篇的方法生出所有 h 只要不到 0.1 秒。)
雖然新的電腦可能可以跑快點,可是這種情況或許真的應該考慮把實作語言改用 C
或是採用其他演算法/寫法。畢竟跑迴圈實在不是 MATLAB 的強項。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: DigiPrince 來自: 140.113.94.230 (05/31 13:19)
→
05/31 14:09, , 1F
05/31 14:09, 1F
→
05/31 14:26, , 2F
05/31 14:26, 2F
推
05/31 16:25, , 3F
05/31 16:25, 3F
推
05/31 16:33, , 4F
05/31 16:33, 4F
→
05/31 16:34, , 5F
05/31 16:34, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):