How to create a matrix from multiples of submatrice?

2 Ansichten (letzte 30 Tage)
Timon Viola
Timon Viola am 11 Jun. 2020
Bearbeitet: madhan ravi am 11 Jun. 2020
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!

Akzeptierte Antwort

madhan ravi
madhan ravi am 11 Jun. 2020
Bearbeitet: madhan ravi am 11 Jun. 2020
Z = reshape(rv,1,1,[]) .* diag(Alpha);
Wanted = reshape(Z,numel(rv),[]).'
  2 Kommentare
Michael Soskind
Michael Soskind am 11 Jun. 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 am 11 Jun. 2020
Bearbeitet: madhan ravi am 11 Jun. 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by