作者Gwaewluin (神无月 孝臣)
看板MATLAB
标题Re: [问题] 请问如何使用矩阵取代这个回圈
时间Thu May 10 14:47:15 2007
※ 引述《CDavid (UNFAIR)》之铭言:
: 假设有一个矩阵M
: 1 2 3 4 5
: 2 3 4 5 6
: M=3 4 5 6 7
: 4 5 6 7 8
: 5 6 7 8 9
: 原本的写法是
: a=zeros(2,4*4)
: k=1;
: for i=1:4
: for j=1:4
: a(:,k)=sum(M(i:(i+1),j:(j+1))')';
: k=k+1;
: end
: end
: 意思是把矩阵取出2*2的矩阵
: 然後把两行相加
: 存到a矩阵
: 做出来结果会是
: 取出小矩阵
: 1 2 、 2 3 、 3 4 、 4 5
: 2 3 3 4 4 5 5 6 .....再换下一列取小矩阵
: 两行相加 成为
: 3 、 5 、 7 、 9
: 5 7 9 11
: 存到a矩阵
: a=3 5 7 9
: 5 7 9 11........
: 这样的2*16矩阵
: 请问有不用回圈的方法吗?
: 谢谢
M1=reshape(repmat(M(:)',2,1),size(M,1)*2,size(M,2))';
M2=reshape(repmat(M1(:)',2,1),size(M1,1)*2,size(M1,2));
M2([1 end],:)=[];
M2(:,[1 end])=[];
a=reshape(sum(reshape(M2(:,[1:2:end,2:2:end]),[],2),2),2,[])
基本的技巧是把重复的部份先使用repmat扩张处理
然後reshape成全部小矩阵叠在一起的样子
最後再使用sum完成相加後
重新reshape成输出的样子即可
--
Deserves death! I daresay he does. Many that live deserve death. And some die
that deserve life. Can you give that to them? Then be not too eager to deal out
death in the name of justice, fearing for your own safty. Even the wise cannot
see all ends.
Gandalf to Frodo
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.120.25.235