2017-09-07 108 views
3

如果我有一個載體在Matlab中轉置三角矩陣的列向量?

A = [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] 

有沒有辦法將其轉換爲一個矩陣

[0 2 5 9 14 
1 4 8 13 0 
3 7 12 0 0 
6 11 0 0 0 
10 0 0 0 0 ] 

對於長的矢量A 2016

到目前爲止:

n = 63; 
B = triu(true(n)); 
C = zeros(n); 
C(B) = A; 

看起來是在正確的路線上。

然後,試圖創建向量d,其中每一列是對角線矩陣C ...

D = zeros(n); 

for i = 1:n; 
    D(:,i) = diag(C,i-1); 
end 

但在第二次迭代的對角線長度不填充整個柱(如預期和期望),我得到一個尺寸不匹配錯誤。

+0

所以最後4個元素成爲第一行,後3個元素成爲第二行(帶有零填充),接下來的2個元素成爲第三行(帶有零填充)等等? – Wolfie

+0

我已經編輯了這個問題,以便更清楚地知道我在...之後...對不起,如果它仍然沒有解釋得很好!實際上,我需要爲2016年的矩陣A重複這種模式。 –

+0

如果你給實際的結果矩陣提供了你想要使用的任何填充值(或者你實際上想要一個單元陣列?),這將有所幫助。您在MATLAB中顯示的語法不合法。 – beaker

回答

4

這是假設的A長度是三角形的數量,從而A能適應半包括對角線的方形矩陣:

N = (sqrt(numel(A)*8+1)-1)/2; 
t = hankel(1:N); 
t(t==0) = inf; 
[~, ind]= sort(t(:)); 
ind = ind(1:numel(A)); 
result = zeros(N); 
result(ind) = A; 
+0

另一個解決方案! –

4

這裏有一個來自bsxfun一些幫助和cumsum -

function out = zigzag_upward(A, n) 
% If n is needed to be computed : n = floor(sqrt(numel(A)*2)) 
r = 1:n; 
valid_mask = bsxfun(@le, r,r(end:-1:1)'); 
all_vals = cumsum([(cumsum(0:n-1)+1)' bsxfun(@plus,[0:n-1]',2:n)],2); 
all_vals(all_vals > numel(A)) = 1; 
out = valid_mask .* A(all_vals); 

採樣運行 -

>> A = [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]+20; 
>> zigzag_upward(A, 5) 
ans = 
    20 22 25 29 34 
    21 24 28 33  0 
    23 27 32  0  0 
    26 31  0  0  0 
    30  0  0  0  0 
+0

非常感謝您的幫助!我需要的解決方案是轉置(出),但這可能是由於我的可怕解釋! –

+0

我給了你+1儘管''':-P你會改變它爲'。'嗎? –

+0

@LuisMendo哈,以及所有這些都是範圍數組,所以應該是安全的! :D這是故意的BTW;) – Divakar