Azzera filtri
Azzera filtri

Convert values upper triangular matrix into vector

107 visualizzazioni (ultimi 30 giorni)
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 Commenti
Fathima Bareeda
Fathima Bareeda il 5 Giu 2021
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 il 5 Giu 2021
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

Accedi per commentare.

Risposta accettata

Jan
Jan il 14 Mag 2019
Modificato: Jan il 17 Mag 2019
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 Commenti
Lucas Bezerra
Lucas Bezerra il 25 Mag 2021
It becomes even simpler if you use the triu function instead:
m = triu(true(size(A)));
v = A(m)
Jan
Jan il 25 Mag 2021
@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] .

Accedi per commentare.

Più risposte (1)

Witold Waldman
Witold Waldman il 25 Apr 2024
Modificato: Witold Waldman il 25 Apr 2024
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>

Categorie

Scopri di più su Operating on Diagonal Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by