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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com