Re: [問題] 三維矩陣的遞迴設計已回收
我先解釋一下 我目前理解的情況
你原本的作二維法是 有一個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
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
07/12 07:17, 5F
→
07/12 07:18, , 6F
07/12 07:18, 6F
推
07/14 12:32, , 7F
07/14 12:32, 7F
→
07/14 12:32, , 8F
07/14 12:32, 8F
討論串 (同標題文章)