I want to build the matrix

조회 수: 2 (최근 30일)
Husam
Husam 2024년 12월 31일
댓글: Husam 2024년 12월 31일
I want to build the matrix G from a square matrix A, which has n×n dimensions.
The matrix G is defined as :
G = [ I O O O ...;
A I O O ... ;
A^2 A I O ...;
A^3 A^2 A I ...]
where:
  • I is the n×n identity matrix (I=eye(n)),
  • O is the n×n zero matrix (O=zeros(n)).
The resulting G has dimensions (nm)×(nm), where m is the number of block rows and columns in G
Can any one Help me
Thanx
  댓글 수: 3
Mr. Pavl M.
Mr. Pavl M. 2024년 12월 31일
  • Good question and good answer of Stephen23 and M. Agarwal, I checked both are correct, first is with no explicit loops, second is with 1 loop, I tested the running times and in 2 IDEs (both in Mt-b and Oc-e it runs, who will require it in TCE Julia, in TCE Python?), the 2 constructing methods summarized: as well,why function runs faster?:
clc
clear all
close all
m = 4;
n = 3;
A = randi(9,n)
A = 3×3
9 7 9 5 5 8 5 2 7
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
C = [{zeros(n),eye(n)},arrayfun(@(p)A^p,1:m-1,'uni',0)];
tic
t1 = cputime;
G1 = cell2mat(C(1+tril(toeplitz(1:m))))
G1 = 12×12
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 9 7 9 1 0 0 0 0 0 0 0 0 5 5 8 0 1 0 0 0 0 0 0 0 5 2 7 0 0 1 0 0 0 0 0 0 161 116 200 9 7 9 1 0 0 0 0 0 110 76 141 5 5 8 0 1 0 0 0 0 90 59 110 5 2 7 0 0 1 0 0 0 3029 2107 3777 161 116 200 9 7 9 1 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
toc
Elapsed time is 0.023803 seconds.
t2 = cputime;
display(t2-t1)
0.0400
function G = constructG(A, m)
n = size(A, 1);
% Create block diagonal of identity matrices
G = kron(eye(m), eye(n));
% Fill lower triangular blocks with powers of A
current_power = A;
for i = 1:m-1
% Fill the i-th subdiagonal
for j = 1:m-i
row_idx = (i+j-1)*n + (1:n);
col_idx = (j-1)*n + (1:n);
G(row_idx, col_idx) = current_power;
end
if i < m - 1
current_power = current_power * A;
end
end
end
tic
t1 = cputime;
G2 = constructG(A, m)
G2 = 12×12
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 9 7 9 1 0 0 0 0 0 0 0 0 5 5 8 0 1 0 0 0 0 0 0 0 5 2 7 0 0 1 0 0 0 0 0 0 161 116 200 9 7 9 1 0 0 0 0 0 110 76 141 5 5 8 0 1 0 0 0 0 90 59 110 5 2 7 0 0 1 0 0 0 3029 2107 3777 161 116 200 9 7 9 1 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
toc
Elapsed time is 0.032379 seconds.
t2 = cputime;
display(t2-t1)
0.0300
Husam
Husam 2024년 12월 31일
Thank you very much and Happy New Year

댓글을 달려면 로그인하십시오.

채택된 답변

Malay Agarwal
Malay Agarwal 2024년 12월 31일
편집: Malay Agarwal 2024년 12월 31일
Hi @Husam,
You can build the required matrix using the following function:
function G = constructG(A, m)
n = size(A, 1);
% Create block diagonal of identity matrices
G = kron(eye(m), eye(n));
% Fill lower triangular blocks with powers of A
current_power = A;
for i = 1:m-1
% Fill the i-th subdiagonal
for j = 1:m-i
row_idx = (i+j-1)*n + (1:n);
col_idx = (j-1)*n + (1:n);
G(row_idx, col_idx) = current_power;
end
if i < m - 1
current_power = current_power * A;
end
end
end
You can use the function as follows:
A = randi(5, 3)
A = 3×3
1 1 5 1 4 3 2 1 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
G = constructG(A, 4)
G = 12×12
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 5 1 0 0 0 0 0 0 0 0 1 4 3 0 1 0 0 0 0 0 0 0 2 1 3 0 0 1 0 0 0 0 0 0 12 10 23 1 1 5 1 0 0 0 0 0 11 20 26 1 4 3 0 1 0 0 0 0 9 9 22 2 1 3 0 0 1 0 0 0 68 75 159 12 10 23 1 1 5 1 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Here are some details on the implementation:
  • The kron() function is used to create a matrix where each block diagonal is the identity matrix .
  • Then, the lower triangular blocks are filled with the powers of A. The powers of A are calculated incrementally to make the function more efficient.
Refer to the following resources for more information:
Hope this helps!
  댓글 수: 1
Husam
Husam 2024년 12월 31일
Thank you very much and Happy New Year

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Stephen23
Stephen23 2024년 12월 31일
편집: Stephen23 2024년 12월 31일
m = 4;
n = 3;
A = randi(9,n)
A = 3×3
7 4 2 5 3 5 9 7 7
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
C = [{zeros(n),eye(n)},arrayfun(@(p)A^p,1:m-1,'uni',0)];
G = cell2mat(C(1+tril(toeplitz(1:m))))
G = 12×12
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 7 4 2 1 0 0 0 0 0 0 0 0 5 3 5 0 1 0 0 0 0 0 0 0 9 7 7 0 0 1 0 0 0 0 0 0 87 54 48 7 4 2 1 0 0 0 0 0 95 64 60 5 3 5 0 1 0 0 0 0 161 106 102 9 7 7 0 0 1 0 0 0 1311 846 780 87 54 48 7 4 2 1 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
  댓글 수: 1
Husam
Husam 2024년 12월 31일
Thank you very much and Happy New Year

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by