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