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

作者: balancer12 (Do Something)   2022-12-14 14:56:47
※ 引述《sunev (Veritas)》之銘言:
: ※ 引述《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過,請小心使用
感謝sunev大大的建議
寫成如下後就可以達到N階迴圈了
感謝!
B = length(GroupB_CapVariable);
A = GroupA_numPort ;
for icols = A:-1:1
for irow = 0:1:(B^A-1)
cols_temp = A - icols ;
ind = mod( fix(irow/B^cols_temp) , B ) ;
A_Port(irow+1,icols) = GroupB_CapVariable(ind+1);
end
end

Links booklink

Contact Us: admin [ a t ] ucptt.com