作者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