Re: [討論] 請教N個for迴圈如何實現呢

看板MATLAB作者 (Veritas)時間2年前 (2022/12/06 18:50), 2年前編輯推噓2(201)
留言3則, 3人參與, 2年前最新討論串2/3 (看更多)
※ 引述《balancer12 (Do Something)》之銘言: : 想請教各位大大 : 我有一個變數A裡面可能有三個變異量 : 在A變異量裡面又各有兩個變數B : 如此總共會有2*2*2=2^3=8組 : 寫法如下 : GroupA_numPort=[ 1 2 3 ]; : GroupB_CapVariable=[ 10e-6 100e-6 ]; : iTest=0; : for i= 1:length(GroupB_CapVariable) : for j= 1:length(GroupB_CapVariable) : for k= 1:length(GroupB_CapVariable) : A_Port=[ GroupB_CapVariable(i) , GroupB_CapVariable(j) , GroupB_CapVaria : ble(k) ] ; : iTest=iTest+1; : end : end : end : 因變數A有三個,必須寫三次for loop : 若變數A變成5、10、99...... : 不太可能寫這麼多個for loop@@ : 請問有什麼方式可以實現N個for 迴圈嗎? : 謝謝大家指教! ndgrid 可以做 結果會像是 [x1,x2,x3]=ndgrid(GroupB_CapVariable); A_Port=[x1(:),x2(:),x3(:)]; [x1,x2,x3] 這個語法可以選擇再用eval硬幹字串 或是直接去魔改內建的ndgrid.m (把nout 改掉,並直接對varagrout做再處理) 這邊雖然避開了for-loop 但把結果一次存下來的結果就是會佔用記憶體 尤其你的結果是n的d次方 (n,d定義請參照下方) 所以要格外小心記憶體會不會爆掉 當然這也是matlab 避開for-loop的通病就是了 另一個可能是你只是煩語法,不是想加速 那麼可以選擇 iTest=0; n = length(GroupB_CapVariable); d = length(GroupA_numPort); for i = 0:n^d-1 % 手動把i轉成d進位,並把各位數算出來 % 請自行小心跑太久或overflow,畢竟n^d很可怕 remain = i; A_Port = zeros(1,d); for digit=d:-1:1 ind = mod(remain,d^(digit-1))+1; A_Port(digit) = GroupB_CapVariable(ind); remain = remain - d^(digit-1); end iTest=iTest+1; end 以上code都還沒debug過,請小心使用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.54.137 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1670323809.A.E71.html ※ 編輯: sunev (140.112.54.137 臺灣), 12/06/2022 18:52:07 ※ 編輯: sunev (140.112.54.137 臺灣), 12/06/2022 18:54:00 ※ 編輯: sunev (140.112.54.137 臺灣), 12/06/2022 19:04:07

12/06 22:02, 2年前 , 1F
好清流的pseudo-code,好久沒見到這種討論了。
12/06 22:02, 1F

12/06 22:19, 2年前 , 2F
謝謝sunev大的建議!小的會在試試看~
12/06 22:19, 2F

12/07 10:22, 2年前 , 3F
matlab的TA大多不在意這種討論....
12/07 10:22, 3F
文章代碼(AID): #1ZZnvXvn (MATLAB)
文章代碼(AID): #1ZZnvXvn (MATLAB)