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

看板MATLAB作者 (angelaa)時間13年前 (2011/07/12 02:41), 編輯推噓4(404)
留言8則, 3人參與, 最新討論串2/2 (看更多)
我先解釋一下 我目前理解的情況 你原本的作二維法是 有一個50*30的矩陣 然後你去判斷每一列 如果總和小於15 把它取代成XXX 並且f1++ 否則的話 把它取代成OOO 並且 f2++ 然後你的問題是 如果有 50*30 的資料兩百筆(兩百個50*30的矩陣) 你把它改為 50*30*200個矩陣 然後 你希望 每一個50*30的矩陣 可以做到剛剛二維的事情 而且這200筆資料的 f1 & f2 分別要是獨立的 但是你做起來 卻是 f1 f2 會到 50*200(每次判斷一列,共50列 , 並且有兩百筆) 你的寫法得到那個結果 並不奇怪 你總共做了 50*200次的判斷 所以那結果很正常 以我的理解 對你程式碼的內容做點修改 %====修改的範例程式碼====% %====矩陣P200為(50,30,200)====% f1 = zeros(1,200); f2 = f1; %遞迴指標值還是要這樣設定嗎?% 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(j) = f1(j) + 1; f11(f1(j),:,j) = P200(i,:,j); else f2(j) = f2(j) + 1; f12(f2(j),:,j) = P200(i,:,j); end end end %====結束====% 這樣f1 跟 f2 會變成1*200的矩陣 就分別會是第"index"筆資料的f1 f2值 不知道這樣是不是你要的? ※ 引述《susuyumi (鈴弓)》之銘言: : 問題:原本我的資料為二維矩陣,處理遞迴的寫法也沒有問題; : 但當資料擴展成三維矩陣的時候,遞迴寫法就爆表了.... : 使用的矩陣: : 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: 118.160.65.115

07/12 02:57, , 1F
嗯嗯,這樣的理解沒錯,修改的code也的確可以跑出來
07/12 02:57, 1F

07/12 03:01, , 2F
運算的速度也很快看來沒有問題,很正確。感謝你!
07/12 03:01, 2F

07/12 03:02, , 3F
話說連兩天都這個時間點發問...諸位回答的版友真的很感謝
07/12 03:02, 3F

07/12 03:02, , 4F
^^ 可以幫到忙就好 不用客氣
07/12 03:02, 4F

07/12 07:17, , 5F
i迴圈的部分 試著改用邏輯矩陣的方式 會更容易
07/12 07:17, 5F

07/12 07:18, , 6F
ex. lgMtr = sum(P(:,:,j),2) < 15;
07/12 07:18, 6F

07/14 12:32, , 7F
回M版友:邏輯矩陣似乎挺好用的!!不過有點難套用到我要用
07/14 12:32, 7F

07/14 12:32, , 8F
的情況...總之還是謝謝提供方法
07/14 12:32, 8F
文章代碼(AID): #1E6qF1rh (MATLAB)
文章代碼(AID): #1E6qF1rh (MATLAB)