Put elements into corresponding locations of upper triangular matrix
22 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Xh Du
el 26 de Jul. de 2017
Comentada: KUMAR TRIPATHY
el 3 de Oct. de 2021
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 comentario
Jan
el 26 de Jul. de 2017
Is this a homework question? If so, please mention it, because then a different type of answers is required.
Respuesta aceptada
Jan
el 26 de Jul. de 2017
Editada: Jan
el 26 de Jul. de 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 comentarios
Raphael
el 1 de Mayo de 2019
This should do the trick:
A=1:6
B=tril(ones(3))
B(B==1)=A
B'
Anna Iatckova
el 30 de Jul. de 2020
A=1:6
B=triu(ones(3))
B(B==1)=A
saves you a line.
Más respuestas (1)
Roger Stafford
el 26 de Jul. de 2017
Let vector ‘inpt’ have size = n*(n+1)/2,1.
otpt = zeros(n);
otpt(triu(ones(n),0)==1) = inpt;
3 comentarios
warnerchang
el 4 de Jun. de 2021
Brilliant! it's actually the sum formula for arithmetic sequence! very helpful for understanding.
Ver también
Categorías
Más información sobre Loops and Conditional Statements en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!