2017-09-07 68 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