Re: [討論] 請教N個for迴圈如何實現呢
※ 引述《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
12/06 22:02, 1F
推
12/06 22:19,
2年前
, 2F
12/06 22:19, 2F
→
12/07 10:22,
2年前
, 3F
12/07 10:22, 3F
討論串 (同標題文章)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章