Convert values upper triangular matrix into vector

116 次查看(过去 30 天)
Hi all,
Imagine a matrix of the following form:
1 2 3 4 5
0 4 6 8 10
0 0 9 12 15
0 0 0 16 20
0 0 0 0 25
Now i do like to obtain a vector with only the values of the upper triangular matrix. in other words a vector of underneath form.
[1 2 3 4 5 4 6 8 10 9 12 15 16 20 25]
What is the best way to obtain this vector?
Thanks in advance
  2 个评论
Fathima Bareeda
Fathima Bareeda 2021-6-5
What is the best way to obtain vector in the form of diagonal elements first and then upper triangular elements..
For eg:[1 4 9 16 25 2 3 4 5 6 8 10 12 15 20]
Walter Roberson
Walter Roberson 2021-6-5
M = [ 1 2 3 4 5
0 4 6 8 10
0 0 9 12 15
0 0 0 16 20
0 0 0 0 25
]
M = 5×5
1 2 3 4 5 0 4 6 8 10 0 0 9 12 15 0 0 0 16 20 0 0 0 0 25
D = diag(M);
eg = [D.', squareform((M-diag(D)).')]
eg = 1×15
1 4 9 16 25 2 3 4 5 6 8 10 12 15 20

请先登录,再进行评论。

采纳的回答

Jan
Jan 2019-5-14
编辑:Jan 2019-5-17
At = A.';
m = tril(true(size(At)));
v = At(m).'
Maybe this is faster (>=R2016b due to auto-expanding):
At = A.';
m = (1:size(At,1)).' >= (1:size(At,2));
v = At(m);
  4 个评论
Lucas Bezerra
Lucas Bezerra 2021-5-25
It becomes even simpler if you use the triu function instead:
m = triu(true(size(A)));
v = A(m)
Jan
Jan 2021-5-25
@Lucas Bezerra: The replies the elements in the wrong order [1 2 4 3 6 9 4 8 12 16 5 10 15 20 25].' instead of the wanted [1 2 3 4 5 4 6 8 10 9 12 15 16 20 25] .

请先登录,再进行评论。

更多回答(1 个)

Witold Waldman
Witold Waldman 2024-4-25,5:29
编辑:Witold Waldman 2024-4-25,5:31
A=[
1 2 3 4 5
0 4 6 8 10
0 0 9 12 15
0 0 0 16 20
0 0 0 0 25
];
% The following previously submitted code creates two intermediate
% matrices, At and m, in addition to the solution array v.
tic
At = A.';
m = tril(true(size(At)));
v = At(m).';
toc
Elapsed time is 0.003788 seconds.
v
v = 1x15
1 2 3 4 5 4 6 8 10 9 12 15 16 20 25
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
% The following code does not create any intermediate matrices.
% It might be preferred when dealing with very large matrices.
% In testing, this code was the slower of the two.
tic
nA = size(A,1);
ibeg = 1;
for n = 1:nA
iend = ibeg+nA-n;
v(ibeg:iend) = A(n,n:nA);
ibeg = iend+1;
end
toc
Elapsed time is 0.002825 seconds.
v
v = 1x15
1 2 3 4 5 4 6 8 10 9 12 15 16 20 25
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

类别

Help CenterFile Exchange 中查找有关 Operating on Diagonal Matrices 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by