How to create a matrix from multiples of submatrice?

4 ビュー (過去 30 日間)
Timon Viola
Timon Viola 2020 年 6 月 11 日
編集済み: madhan ravi 2020 年 6 月 11 日
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!

採用された回答

madhan ravi
madhan ravi 2020 年 6 月 11 日
編集済み: madhan ravi 2020 年 6 月 11 日
Z = reshape(rv,1,1,[]) .* diag(Alpha);
Wanted = reshape(Z,numel(rv),[]).'
  2 件のコメント
Michael Soskind
Michael Soskind 2020 年 6 月 11 日
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 2020 年 6 月 11 日
編集済み: madhan ravi 2020 年 6 月 11 日
" 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.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMatrices and Arrays についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by