Re: [問題] 產生所有[1~H 1~H 1~H .. 1~H]這些vector已回收

看板MATLAB作者 (幻無影)時間15年前 (2010/05/31 13:18), 編輯推噓2(203)
留言5則, 4人參與, 最新討論串4/4 (看更多)
※ 引述《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
太感謝了!!跑很久在我預期中 我自己來寫H進位大概會要跑一
05/31 16:33, 4F

05/31 16:34, , 5F
個月吧XDD 希望不要潛水XD 你的回答都超好~~
05/31 16:34, 5F
文章代碼(AID): #1C0qQKVY (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1C0qQKVY (MATLAB)