[討論] 矩陣拆解成小矩陣

看板MATLAB作者 (one shot one kill)時間11年前 (2014/03/10 20:16), 編輯推噓4(4014)
留言18則, 2人參與, 最新討論串1/1
各位前輩賢拜好 小的想要把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

03/10 22:56, , 1F
A=rand(100,100);
03/10 22:56, 1F

03/10 22:56, , 2F
m=20;n=20;
03/10 22:56, 2F

03/10 22:56, , 3F
B=reshape(A,m,100*100/m)% B is m * 10000/m
03/10 22:56, 3F

03/10 22:56, , 4F
k=1:n:100*100/m
03/10 22:56, 4F

03/10 22:56, , 5F
for(times=1:length(k)-1)
03/10 22:56, 5F

03/10 23:02, , 6F
eval(sprintf('A%d=B(:, %d : %d );',times,k(times),k(
03/10 23:02, 6F

03/10 23:03, , 7F
times+1)-1)) end
03/10 23:03, 7F
感謝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)

03/11 14:48, , 8F
按照道理來說用了一個reshape
03/11 14:48, 8F

03/11 14:49, , 9F
就只需要用一個for loop才對啊,難道我搞錯了?
03/11 14:49, 9F

03/11 14:55, , 10F
把k向量的值或者times的值調整下應該就能得到你要的結果
03/11 14:55, 10F
剛剛調整了一下但沒有試成功(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)

04/11 03:55, , 11F
上面寫法我看不太懂,但是我會用cell來寫
04/11 03:55, 11F

04/11 03:55, , 12F
A=reshape(1:100*100,100,100);
04/11 03:55, 12F

04/11 03:55, , 13F
m=0;
04/11 03:55, 13F

04/11 03:56, , 14F
for i=1:20:100, m=m+1; B{m}=A(i:i+19,:); end
04/11 03:56, 14F

04/11 03:56, , 15F
A=cell(5,5);
04/11 03:56, 15F

04/11 03:58, , 16F
for i=1:m, for j=1:m,A{i,j}=reshape(B{i}(1+(400*(j-1))
04/11 03:58, 16F

04/11 03:59, , 17F
A{i,j}=reshape(B{i}(1+(400*(j-1)):400*j),20,20); end
04/11 03:59, 17F

04/11 04:02, , 18F
完整 A{i,j}要看下面那行,上面被切到, 最後要兩個end
04/11 04:02, 18F
文章代碼(AID): #1J7Qq3IX (MATLAB)
文章代碼(AID): #1J7Qq3IX (MATLAB)