How to create a matrix from multiples of submatrice?

4 visualizzazioni (ultimi 30 giorni)
I would like to find a smarter way of building a larger matrix from vectors. The following code works fine:
rv = [1 2 3 4];
alpha =[0.0140;
0.0100;
0.0100;
0.0100];
c = [];
for i = 1:4
c = [c; diag(alpha).*rv(i)];
end
>> c =
0.0140 0 0 0
0 0.0100 0 0
0 0 0.0100 0
0 0 0 0.0100
0.0280 0 0 0
0 0.0200 0 0
0 0 0.0200 0
0 0 0 0.0200
0.0420 0 0 0
0 0.0300 0 0
0 0 0.0300 0
0 0 0 0.0300
0.0560 0 0 0
0 0.0400 0 0
0 0 0.0400 0
0 0 0 0.0400
Essentially I build a submatrix from a vector. Then I multiple the diagonal submatrix with each element of a vector. Then I concatenate these vertically.
Is there a computationally more efficient way of doing this?
Thanks!

Risposta accettata

madhan ravi
madhan ravi il 11 Giu 2020
Modificato: madhan ravi il 11 Giu 2020
Z = reshape(rv,1,1,[]) .* diag(Alpha);
Wanted = reshape(Z,numel(rv),[]).'
  2 Commenti
Michael Soskind
Michael Soskind il 11 Giu 2020
Even more confusing but with no tansposes and in one line:
repmat(diag(alpha),4,1).*reshape(repmat(rv, 4,4),[],4)
madhan ravi
madhan ravi il 11 Giu 2020
Modificato: madhan ravi il 11 Giu 2020
" and in one line"
Wanted = reshape(reshape(rv,1,1,[]) .* ...
diag(Alpha),numel(rv),[]).'
"Even more confusing"
Why?
N = 1e6;
tic
for k = 1:N
Z = reshape(rv,1,1,[]) .* diag(Alpha);
Wanted = reshape(Z,numel(rv),[]).';
end
% Elapsed time is 4.847994 seconds.
toc
tic
for k = 1:N
repmat(diag(alpha),4,1) .* reshape(repmat(rv, 4,4),[],4);
end
toc
% Elapsed time is 5.865444 seconds.

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

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

Start Hunting!

Translated by