作者onezillion (寶貝)
看板MATLAB
標題Re: [問題] 不用迴圈,讓兩個矩陣做local的運算
時間Thu Jan 29 18:03:14 2015
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
推 waterCoka: 謝謝你的回覆 有沒有類似的方法能夠運用在cell上呢? 01/29 18:54
→ waterCoka: 假設缺少鄰居的部分都已經補0 01/29 18:54
→ waterCoka: 也就是以位置(1,1)為中心的A1 取3x3 matrix 01/29 18:55
→ waterCoka: 並且把這個matrix存放到cell(1,1)中 其他位置也是一樣 01/29 18:55
推 waterCoka: 也就是有25個3x3 matrix 01/29 19:25
→ onezillion: cell用pointer,讀寫連續性應該不會比matrix好,大量資 01/29 19:47
→ onezillion: 料下效能不見得高,而且還要多個loop先把matrix轉成cel 01/29 19:47
→ onezillion: l 01/29 19:47
推 waterCoka: 會想分開存原因是 除了自己local內部要做運算 01/29 20:05
→ waterCoka: 還要額外跟另一個local matrix相乘 01/29 20:05
推 waterCoka: 若是用此方式取得local matrix 計算時還是會用到loop 01/29 20:18