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

作者: sunev (Veritas)   2022-12-06 18:50:07
※ 引述《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過,請小心使用
作者: YoursEver (豬是妳)   2022-12-06 22:02:00
好清流的pseudo-code,好久沒見到這種討論了。
作者: balancer12 (Do Something)   2022-12-06 22:19:00
謝謝sunev大的建議!小的會在試試看~
作者: sunev (Veritas)   2022-12-07 10:22:00
matlab的TA大多不在意這種討論....

Links booklink

Contact Us: admin [ a t ] ucptt.com