Effacer les filtres
Effacer les filtres

Put elements into corresponding locations of upper triangular matrix

24 vues (au cours des 30 derniers jours)
Xh Du
Xh Du le 26 Juil 2017
Hi all,
Imagine I have a vector:
inpt = (1:6)';
Now I'd like to put elements of inpt in the upper triangular part of a 3 by 3 matrix otpt, so I have:
otpt =
1 2 4
0 3 5
0 0 6
What's the best way to do it? Thanks!
  1 commentaire
Jan
Jan le 26 Juil 2017
Is this a homework question? If so, please mention it, because then a different type of answers is required.

Connectez-vous pour commenter.

Réponse acceptée

Jan
Jan le 26 Juil 2017
Modifié(e) : Jan le 26 Juil 2017
Start with nested loops:
v = 1:6;
n = round((sqrt(8 * numel(v) + 1) - 1) / 2);
M = zeros(n, n);
c = 0;
for i2 = 1:n
for i1 = 1:i2
c = c + 1;
M(i1, i2) = v(c);
end
end
In the next step you can vectorize the inner loop: Move the loop index inside the assignment:
n = round((sqrt(8 * numel(v) + 1) - 1) / 2);
M = zeros(n, n);
a = 1;
for k = 1:n
b = a + k - 1;
M(1:k, k) = v(a:b);
a = b + 1;
end
Is this nicer? Questionable, but maybe faster.
Now use a built-in function:
n = round((sqrt(8 * numel(v) + 1) - 1) / 2);
M(triu(ones(n)) == 1) = v;
or better:
M(triu(true(n))) = v;
[EDITED] Some timings - what did you expect?
v = 1:5050;
tic; for k = 1:10000; y = SerialTriU(v); end, toc
Elapsed time is 0.772492 seconds. % Two loops
Elapsed time is 2.448738 seconds. % Inner loop vectorized
Elapsed time is 1.029641 seconds. % TRIU(ONES)
Elapsed time is 0.659360 seconds. % TRIU(TRUE)
  5 commentaires
Raphael
Raphael le 1 Mai 2019
This should do the trick:
A=1:6
B=tril(ones(3))
B(B==1)=A
B'
Anna Iatckova
Anna Iatckova le 30 Juil 2020
A=1:6
B=triu(ones(3))
B(B==1)=A
saves you a line.

Connectez-vous pour commenter.

Plus de réponses (1)

Roger Stafford
Roger Stafford le 26 Juil 2017
Let vector ‘inpt’ have size = n*(n+1)/2,1.
otpt = zeros(n);
otpt(triu(ones(n),0)==1) = inpt;
  3 commentaires
warnerchang
warnerchang le 4 Juin 2021
Brilliant! it's actually the sum formula for arithmetic sequence! very helpful for understanding.
KUMAR TRIPATHY
KUMAR TRIPATHY le 3 Oct 2021
Absolutely brilliant, concise and crisp!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by