2014-03-14 25 views
0

我嘗試使用下面的矩陣對角線Matlab的:塊三對角與非方形矢量

base = [a b c d e f 0; 
     0 g h i j k l]; 

我需要的結果矩陣看起來像這樣來創建一個對角矩陣...

[a b c d e f 0 0 0; 
0 g h i j k l 0 0; 
0 0 a b c d e f 0; 
0 0 0 g h i j k l]; 

除了它需要「N」元素高大

我已經使用kron功能嘗試,但它改變每個連續行的元素太多的權利。

我怎樣才能完成我所需要的方式,我可以任意選擇n

+0

是'N'總是偶數?或者你認爲你顯示的矩陣是「2」高嗎? – Floris

+1

爲什麼在SO上有這麼多的matlab作業問題,沒有任何代碼? – Coderchu

+0

顯示你用'kron'試過的東西+1 –

回答

2

您可以用二維卷積做到這一點非常快:

n = 4; %// desired number of rows in result. Should be a multiple of size(base,1) 
T = eye(n-1); 
T(2:size(base,1):end,:) = 0; 
result = conv2(base,T); 

示例:

base = 

    0.7497 0.3782 0.4470 0.5118 0.6698 0.3329   0 
     0 0.9850 0.5638 0.9895 0.4362 0.4545 0.8578 

n=4結果是

result = 

    0.7497 0.3782 0.4470 0.5118 0.6698 0.3329   0   0   0 
     0 0.9850 0.5638 0.9895 0.4362 0.4545 0.8578   0   0 
     0   0 0.7497 0.3782 0.4470 0.5118 0.6698 0.3329   0 
     0   0   0 0.9850 0.5638 0.9895 0.4362 0.4545 0.8578 
+1

+1:很好!雖然我的解決方案似乎對大的'n'好得多......看來'conv2'是O(n²),或者至少是超線性的......這是真的嗎? –

+1

@RodyOldenhuis謝謝!是的,我敢打賭它至少是超線性的。但我還沒有測試過 –

1

簡單的方法是使用重複的界限外分配。在這些情況下,MATLAB將自動填充任何缺失的條目與0。具體方法如下:

%// Some test variables 
a = rand; g = rand; 
b = rand; h = rand; 
c = rand; i = rand; 
d = rand; j = rand; 
e = rand; k = rand; 
f = rand; l = rand; 

%// base matrix 
base = [ 
    a b c d e f 0; 
    0 g h i j k l]; 

%// use out-of-bounds assignment 
n = 3; 
output = base; 
for ii = 1:n 
    output(end+1:end+size(base,1), size(base,1)*ii+1:end+size(base,1)) = base; 
end 

難的方法是更快的方式(相關時n大和/或需要重複這個非常頻繁)。弄清楚其背後指數將在由與原矩陣值最終矩陣填充圖案,然後生成這些索引列表,並指定這些值的指標:

[b1,b2]  = size(base); 
[ii,jj,vv] = find(base); 
inds   = bsxfun(@plus, (ii + (n+1)*b1*(jj-1)).', (0:n).'*b1*(1 + (n+1)*b1)); 
output  = zeros((n+1)*b1, b2+n*b1); 
output(inds) = repmat(vv.', n+1, 1) 

我會離開它,因爲一個練習,你找出這裏發生了什麼確切:)