Re: [問題] 不用迴圈,讓兩個矩陣做local的運算

看板MATLAB作者 (寶貝)時間10年前 (2015/01/29 18:03), 10年前編輯推噓4(407)
留言11則, 2人參與, 最新討論串2/2 (看更多)
a=rand(5,6); b=rand(5,6); m1=size(a,1)-2; idx1=reshape(repmat((0:2)',[1,m1])+repmat((1:m1),[3,1]),[3*m1,1]); m2=size(a,2)-2; idx2=reshape(repmat((0:2)',[1,m2])+repmat((1:m2),[3,1]),[3*m2,1]); a1=a(idx1,idx2); b1=b(idx1,idx2); % 空間換取迴圈, 把所有local matrix合併成一個大的matrix, 直接做a1,b1的運算 % 不過只能做element by element運算, 其他像是反矩陣, det, 矩陣乘除都不行 % 你的問題只有把矩陣擷取出來, 怎麼放回原位就靠你了 方法二 生出九組array,每個array對應所有local matrix的個別element的index, 然後在叫出各個element做運算 array生成方法類似上面 ※ 引述《waterCoka (Coka)》之銘言: : 有兩個5x5矩陣如下: : M = [ A1 A2 A3 o o ; M2 = [ B1 B2 B3 o o ; : A4 A5 A6 o o ; B4 B5 B6 o o ; : A7 A8 A9 o o ; B7 B8 B9 o o ; : o o o o o ; o o o o o ; : o o o o o ; o o o o o ; : ] ] : 我想讓兩個矩陣針對各個3x3的local matrix做運算 : 例如: : 當位置在(2,2)時,M跟M2會以位置(2,2)當中心,分別擷取出3x3的local matrix : M_l = [ A1 A2 A3 ; M2_l = [ B1 B2 B3 ; : A4 A5 A6 ; B4 B5 B6 ; : A7 A8 A9 ; B7 B8 B9 ; : ] ] : 在得到local matrix後,先對local matrix的內部做運算來改變M_l跟M2_1原有的值, 接? : 再利用M_l .* M2_l來產生一個新的matrix,並把矩陣內值加總起來當作這個位置新的 : 最後的目標是每個位置都用上述的方式來執行,意即從位置(1,1)~(5,5)都跑過一次 : 不使用迴圈的原因是矩陣過大,跑兩個for loop再加上運算的話所需時間會很久 : 而要先擷取出local matrix是因為還需要做一些local matrix的內部運算來改變M_l跟 : M2_1原有的值 : 問題:請問有沒有不使用迴圈的方式就可以把2個矩陣各個local的區域給擷取出來? : 或是把local的區域儲存在cell中之類的方式? : 像是cell位置(1,1)存的是以(1,1)為中心的3x3 local matrix,其他以此類推 : 希望各位先進能夠提供一些方法或是建議 : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.82.254 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1422525797.A.3B9.html ※ 編輯: onezillion (123.193.172.189), 01/29/2015 18:37:54

01/29 18:54, , 1F
謝謝你的回覆 有沒有類似的方法能夠運用在cell上呢?
01/29 18:54, 1F

01/29 18:54, , 2F
假設缺少鄰居的部分都已經補0
01/29 18:54, 2F

01/29 18:55, , 3F
也就是以位置(1,1)為中心的A1 取3x3 matrix
01/29 18:55, 3F

01/29 18:55, , 4F
並且把這個matrix存放到cell(1,1)中 其他位置也是一樣
01/29 18:55, 4F

01/29 19:25, , 5F
也就是有25個3x3 matrix
01/29 19:25, 5F

01/29 19:47, , 6F
cell用pointer,讀寫連續性應該不會比matrix好,大量資
01/29 19:47, 6F

01/29 19:47, , 7F
料下效能不見得高,而且還要多個loop先把matrix轉成cel
01/29 19:47, 7F

01/29 19:47, , 8F
l
01/29 19:47, 8F

01/29 20:05, , 9F
會想分開存原因是 除了自己local內部要做運算
01/29 20:05, 9F

01/29 20:05, , 10F
還要額外跟另一個local matrix相乘
01/29 20:05, 10F

01/29 20:18, , 11F
若是用此方式取得local matrix 計算時還是會用到loop
01/29 20:18, 11F
文章代碼(AID): #1KoWLbEv (MATLAB)
文章代碼(AID): #1KoWLbEv (MATLAB)