在 Matlab 中转置三角矩阵的列向量?
Column Vector to Transposed Triangular Matrix in 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 ]
对于长度为 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
但是在第二次迭代中,对角线的长度没有填满整个列(如预期和期望的那样),我得到了尺寸不匹配错误。
的一些帮助
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
这里假设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;
如果我有一个向量
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
但是在第二次迭代中,对角线的长度没有填满整个列(如预期和期望的那样),我得到了尺寸不匹配错误。
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
这里假设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;