2013-06-12 31 views
1

我有這樣的矩陣:變換矩陣和重複值

a1 a2 a3 a4 a5 
b1 b2 b3 b4 b5 
c1 c2 c3 c4 c5 
d1 d2 d3 d4 d5 
e1 e2 e3 e4 e5 

,我需要將其轉換到這個矩陣:

a1 a2 a3 b1 b2 b3 c1 c2 c3 
a2 a3 a4 b2 b3 b4 c2 c3 c4 
a3 a4 a5 b3 b4 b5 c3 c4 c5 
b1 b2 b3 c1 c2 c3 d1 d2 d3 
b2 b3 b4 c2 c3 c4 d2 d3 d4 
b3 b4 b5 c3 c4 c5 d3 d4 d5 
c1 c2 c3 d1 d2 d3 e1 e2 e3 
c2 c3 c4 d2 d3 d4 e2 e3 e4 
c3 c4 c5 d3 d4 d5 e3 e4 e5 

,採取了3×3矩陣和遍歷舊胎體投入即它作爲新矩陣中的新行。 我如何在matlab中做到這一點?我聽說循環非常糟糕,如果可以,我應該使用矩陣操作。

+1

真的,你在找什麼操作你可以執行轉換矩陣A到矩陣B這不是一個編程問題,而是一個數學問題。就我而言,我不知道你爲什麼試圖使用任何東西,但一個循環來做到這一點,特別是因爲你正在處理一個9x9矩陣 – bengoesboom

+0

,因爲我正在使用matlab並需要在這裏進行轉換......所以它更多的編程問題,然後數學我認爲 – reox

+4

循環不是很糟糕。我希望當SO上的某個人引導你一個沒有循環的工作答案時,你將浪費大約1億倍的時間等待比通過使用非循環解決方案節省的任何可能的時間更多的時間。 –

回答

1

如果您有權訪問圖像處理工具箱,則可以使用im2col,它甚至可以用於符號變量

A = sym('A%d%d', [5 5]); 
A = sym(A, 'real'); 

Subs = mat2cell(im2col(A, [3 1])', 3*ones(1,5)); 
Res = im2col(Subs, [3 1]); 

Res是包含所述子矩陣的單元的矩陣。

串連它變成一個矩陣:

reshape([Res{:}]', [9 9]) 

,或者如果它不是象徵性的,這也適用:cell2mat(Res)

+1

是的,這很好! – reox

0

這個代碼看看:

clear 
clc 

a1 = 1; a2 = 2; a3 = 3; a4 = 4; a5 = 5; 
b1 = 11; b2 = 12; b3 = 13; b4 = 14; b5 = 15; 
c1 = 21; c2 = 22; c3 = 23; c4 = 24; c5 = 25; 
d1 = 31; d2 = 32; d3 = 33; d4 = 34; d5 = 35; 
e1 = 41; e2 = 42; e3 = 43; e4 = 44; e5 = 45; 

A = [a1 a2 a3 a4 a5; b1 b2 b3 b4 b5; c1 c2 c3 c4 c5; d1 d2 d3 d4 d5; e1 e2 e3 e4 e5]; 
B = zeros(9,9); 

sizeA = size(A); 
sizeB = size(B); 

jj = 1; 
kk = 1; 

for ii = 1 : sizeB(1)  
    B(ii,1:sizeB(1)) = [A(kk, jj:jj+2) A(kk + 1, jj:jj+2) A(kk + 2, jj:jj+2)] 
    jj = jj + 1; 
    if mod(ii,3) == 0 
     kk = kk + 1; 
     jj = 1; 
    end 
end 

我測試你的情況下,A是5×5和B是9x9的。可能需要修改以適應不同大小的A和B.

0

你可以這樣做在一定程度上一般意義上的,但它並不漂亮:

a = [a1, a2, a3, a4, a5]; 
b = [b1, b2, b3, b4, b5]; 
% etc. 

% Rearrange your vector into a matrix configured how you want it 
A = flipdim(toeplitz(a),1); % 5 x 5 matrix in our case 
A = A(ceil(size(A,1)/2):size(A,1), ceil(size(A,2)/2):size(A,2)); % now 3 x 3 

%%% 
% Repeat similar process for b --> B, c --> C, etc. 
%%% 

% Build the resulting matrix up block-by-block 
M = [A, B, C; 
    B, C, D; 
    C, D, E]; 

我無法找到推廣的M建設的好方法,可惜形成使用toeplitz([a,b,c,d,e])一個託普利茨矩陣失敗;你沒有爲你的子矩陣得到正確的格式。儘管如此,你也許可以用它來開始。