作者ntme (one shot one kill)
看板MATLAB
标题[讨论] 矩阵拆解成小矩阵
时间Mon Mar 10 20:16:00 2014
各位前辈贤拜好
小的想要把100*100的矩阵拆解成每个大小20*20的小矩阵
有试过了一小段code但发现跑出来的是对角线20*20的小矩阵
如果要跑出全部的小矩阵就得土法炼钢的一段一段写
想请教前辈有什麽好方法拆解矩阵
(原来试的code)
A是原来100*100的矩阵
r=100 %列的数目
c=100 %行的数目
for i=1:20:r,
for k=19 %一次加19
for n=(i+k),
if n<=r && n<=c %n的值不超过行跟列的值
eval(sprintf('A%dv%d=A(i:i+%d,i:i+%d)',i,n,k,k));
else
end;
end;
end;
end
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.234.45
1F:推 linforce:A=rand(100,100); 03/10 22:56
2F:→ linforce:m=20;n=20; 03/10 22:56
3F:→ linforce:B=reshape(A,m,100*100/m)% B is m * 10000/m 03/10 22:56
4F:→ linforce:k=1:n:100*100/m 03/10 22:56
5F:→ linforce:for(times=1:length(k)-1) 03/10 22:56
6F:推 linforce: eval(sprintf('A%d=B(:, %d : %d );',times,k(times),k( 03/10 23:02
7F:→ linforce:times+1)-1)) end 03/10 23:03
感谢l大
这跑出来的小矩阵跟原来矩阵排列不一样??
我忘了说切出来的小矩阵里面元素排列要跟原本的一样
像是
[ 1 2 3 4 ] [ 1 2 ] [ 3 4 ] [ 9 10 ]
[ 5 6 7 8 ] 切成 [ 5 6 ],[ 7 8 ],[13 14 ],....
[ 9 10 11 12 ]
[ 13 14 15 16 ]
我刚刚参考I大试了把15*15的矩阵分成每个5*5小矩阵
我的想法是
因为reshape的B是从A里面从上往下排
这样每个小矩阵的第一行就是B的第1、16、31、 2、17、32 、3、18、33、
然後再把提B的第 1, 1+3 ,1+6 ,1+9 ,1+12 行 合成一个小矩阵
'' 16, 16+3 ,16+6 ,16+9 ,16+12 ''
code如下
A=randint(15,15,[1 9]); %随机15*15 里面元素1~9的矩阵
m=5;n=5;
B=reshape(A,m,[])
for i=1:1:3
for k=i:15:[(3-1)*15+i]
eval(sprintf('Ai%dk%d=[B(:,%d) B(:,(%d+3)) B(:,(%d+6)) B(:,(%d+9))
B(:,(%d+12))];',i,k,k,k,k,k,k))
end;
end;
图:
http://cl.ly/image/3d2b1X3Y0940/o
虽然可以做出来但很不高明
因为完全是土法炼钢0.0
要是分的小矩阵一多就...
不知道有没有通用的解法
感恩
※ 编辑: ntme 来自: 140.114.234.45 (03/11 02:20)
8F:推 linforce:按照道理来说用了一个reshape 03/11 14:48
9F:→ linforce:就只需要用一个for loop才对啊,难道我搞错了? 03/11 14:49
10F:推 linforce:把k向量的值或者times的值调整下应该就能得到你要的结果 03/11 14:55
刚刚调整了一下但没有试成功(matlab新手0.0)
不过参考I大在其它篇关於矩阵合并的code又改了一下code
想法是把reshape的B里面的第1、4、7、10....行都提出来令成新矩阵T
再把T的1~5,6~10,11~15的矩阵提出来
A=randint(15,15,[1 9]);
m=5;n=5;
B=reshape(A,m,[])
T=[]
for i=1:3:15*15/5,
eval(sprintf('T=[T B(:,%d)]',i))
end;
for ii=1:5:15*15/5/3,
eval(sprintf('T%d=T(:,%d:%d+4)',ii,ii,ii))
end;
图:
http://cl.ly/image/2Q1f3O2L1V39/o
※ 编辑: ntme 来自: 140.114.234.45 (03/11 15:52)
刚刚没用reshape改用两个for 好像成功惹??
A=randint(15,15,[1 9]);
for i=1:5:15,
for j=1:5:15
eval(sprintf('A%dv%d=A(%d:%d+4,%d:%d+4)',i,j,i,i,j,j))
end;
end;
% A6v11 代表A矩阵第(6,11)的元素开始分割出来的小矩阵
※ 编辑: ntme 来自: 140.114.234.45 (03/11 16:25)
11F:→ ja20331:上面写法我看不太懂,但是我会用cell来写 04/11 03:55
12F:→ ja20331:A=reshape(1:100*100,100,100); 04/11 03:55
13F:→ ja20331:m=0; 04/11 03:55
14F:→ ja20331:for i=1:20:100, m=m+1; B{m}=A(i:i+19,:); end 04/11 03:56
15F:→ ja20331:A=cell(5,5); 04/11 03:56
16F:→ ja20331:for i=1:m, for j=1:m,A{i,j}=reshape(B{i}(1+(400*(j-1)) 04/11 03:58
17F:→ ja20331:A{i,j}=reshape(B{i}(1+(400*(j-1)):400*j),20,20); end 04/11 03:59
18F:→ ja20331:完整 A{i,j}要看下面那行,上面被切到, 最後要两个end 04/11 04:02