在Matlab中将列向量转换为转置三角矩阵?

3
如果我有一个向量
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 ]

针对长度为2016的向量A。

目前为止:

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

但是在第二次迭代中,对角线的长度没有填满整个列(这是预期和期望的),我得到了一个维度不匹配的错误。


如果您提供实际的结果矩阵以及您想要使用的任何填充值(或者您可能真正需要一个单元数组),那将会很有帮助。您展示的语法在MATLAB中是不合法的。 - beaker
1
可能是[矩阵“之”字形重新排序]的重复问题(https://dev59.com/23A75IYBdhLWcg3w790Y)。 - beaker
好的,我已经继续使用之前提供的解决方案,但是遇到了另一个小问题...非常抱歉之前的错误。我没有广泛的Matlab经验,这是第一次在stackoverflow上发帖! - Tom Haddow
希望现在我尝试实现的目标更加清晰了吗? - Tom Haddow
是的,在我的情况下,A的长度为2016,适合于一个63x63的矩阵中。 - Tom Haddow
显示剩余7条评论
2个回答

4

这里有一个使用bsxfuncumsum帮助的例子 -

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

非常感谢您的帮助!我需要的解决方案是transpose(out),但这可能是由于我的糟糕解释所致! - Tom Haddow
我给你点赞+1,尽管那里有一个 ' :-P 你能把它改为 .' 吗? - Luis Mendo
@LuisMendo 哈哈,好吧,所有这些都是范围数组,所以应该是安全的! :D 顺便说一下,这是有意的 ;) - Divakar
@LuisMendo 保留bsxfun吧! ;) - Divakar

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;

另一个解决方案! - Tom Haddow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接