[問題] 三維矩陣的遞迴設計已回收

看板MATLAB作者 (鈴弓)時間14年前 (2011/07/12 01:45), 編輯推噓1(1010)
留言11則, 3人參與, 最新討論串1/2 (看更多)
問題:原本我的資料為二維矩陣,處理遞迴的寫法也沒有問題; 但當資料擴展成三維矩陣的時候,遞迴寫法就爆表了.... 使用的矩陣: P <50x30 double> P = [1 0 1 1 0 1 ... 1 1 0 1 1 0 0 0 ... 1 0 . . . . . . . . . . 1 1 0 0 1 1 ... 1 1] % P200 <50x30x200 double> P200 = [1 0 1 1 0 1 ... 1 1 0 1 1 0 0 0 ... 1 0 . . . . . . . . . . 1 1 0 0 1 1 ... 1 1] x200 範例程式碼: f1 = 0; f2 = 0; f11 = zeros(50,30); f12 = zeros(50,30); %以上預先設定矩陣節省運算時間% %====遞迴運算核心部分====% for i = 1:50; if sum(P(i,:)) < 15; %小於15的設定是設定判定標準為總和30的一半 f1 = f1 + 1; f11(f1,:) = P(i,:); else f2 = f2 + 1; f12(f2,:) = P(i,:); end end %====結束====% 擴展為三維時: %====錯誤的範例程式碼====% %====矩陣P200為(50,30,200)====% f1 = 0; f2 = 0; %遞迴指標值還是要這樣設定嗎?% f11 = zeros(50,30,200); f12 = zeros(50,30,200); %以上預先設定矩陣節省運算時間% %====遞迴運算核心部分====% for j = 1:200; for i = 1:50; if sum(P(i,:,j)) < 15; f1 = f1 + 1; f11(f1,:,j) = P200(i,:,j); else f2 = f2 + 1; f12(f2,:,j) = P200(i,:,j); end end end %====結束====% 當資料為二維矩陣的時候,範例的遞迴指標f1 f2都是從1開始向上累加; 上限最高到50(因為只判定二維資料),即資料中所使用的i迴圈次數。 當資料為三維矩陣的時候,範例的遞迴指標f1 f2還是從1開始向上累加; 上限最高到....50*200 = 10000 !?!? 因為判定的資料是三維矩陣,會跑全部的矩陣資料,所以判定的迴圈次數變成是50*200 我希望最後產生的資料,是 <50x30x200 double>的型態。 意指:我希望遞迴指標f1 f2在作前述邏輯判斷的時候,不是一次就做好50*200 = 10000 的判斷,而是每次都跑50次資料,並將結果記錄起來。 如果用笨笨的手寫方法的話,會是寫成這樣的: f1 = 0; f2 = 0; f11 = zeros(50,30); f12 = zeros(50,30); %以上預先設定矩陣節省運算時間% for i = 1:50; if sum(P(i,:,1)) < 15; %小於15的設定是設定判定標準為總和30的一半 f1 = f1 + 1; f11(f1,:,1) = P(i,:,1); else f2 = f2 + 1; f12(f2,:,1) = P(i,:,1); end if sum(P(i,:,2)) < 15; f1 = f1 + 1; f11(f1,:,2) = P(i,:,2); else f2 = f2 + 1; f12(f2,:,2) = P(i,:,2); end . . . end 使用笨笨的手寫方法的話,就必須寫200次if的設定... 不知道版上的諸位能協助解答的嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.213.195

07/12 01:46, , 1F
原本這樣寫的話,三維的情形下f1 f2都會超過50
07/12 01:46, 1F

07/12 01:53, , 2F
你的第三維被j控制住了,所以什麼叫 "每當增進第三維+1的時
07/12 01:53, 2F

07/12 01:53, , 3F
候" ?
07/12 01:53, 3F

07/12 02:02, , 4F
簡單來說,這邊三維矩陣想要做的,是希望把原本二為矩陣能
07/12 02:02, 4F

07/12 02:02, , 5F
作的(50x30 only)擴展成三維(50x30x200);除了把原本二維
07/12 02:02, 5F

07/12 02:03, , 6F
矩陣的資料手動寫200次這個笨方法以外,有什麼方法可以修
07/12 02:03, 6F

07/12 02:03, , 7F
改的聰明一點的?
07/12 02:03, 7F
※ 編輯: susuyumi 來自: 140.123.213.195 (07/12 02:28)

07/12 02:25, , 8F
f1=zeros(1,200); f2=f1; f1=f1+1改f1(j)=f1(j)+1; f2同
07/12 02:25, 8F

07/12 02:25, , 9F
不知道是不是你要的 因為我看不是很懂
07/12 02:25, 9F

07/12 02:29, , 10F
感謝熱心的版友...我重新修改了一下內文讓大家看更清楚些
07/12 02:29, 10F

07/12 02:29, , 11F
(凌晨寫問題文腦袋都不太清楚...真不好意思orz)
07/12 02:29, 11F
文章代碼(AID): #1E6pRIol (MATLAB)
文章代碼(AID): #1E6pRIol (MATLAB)