Kronecker product: Difference between revisions

Content added Content deleted
Line 1,862: Line 1,862:
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0]
</pre>
=={{header|Simula}}==
<lang simula>BEGIN

PROCEDURE OUTMATRIX(A, W); INTEGER ARRAY A; INTEGER W;
BEGIN
INTEGER I, J;
INTEGER LA1, UA1;
INTEGER LA2, UA2;

LA1 := LOWERBOUND(A, 1); UA1 := UPPERBOUND(A, 1);
LA2 := LOWERBOUND(A, 2); UA2 := UPPERBOUND(A, 2);

FOR I := LA1 STEP 1 UNTIL UA1 DO
BEGIN
OUTTEXT("[");
FOR J := LA2 STEP 1 UNTIL UA2 DO
BEGIN
IF NOT (J = LA2) THEN OUTCHAR(' ');
OUTINT(A(I, J), W)
END;
OUTTEXT("]");
OUTIMAGE
END
END OUTMATRIX;

PROCEDURE KRONECKERPRODUCT(A, B, C); INTEGER ARRAY A, B, C;
BEGIN
INTEGER I, J, K, L, CI, CJ;
INTEGER LA1, UA1;
INTEGER LA2, UA2;
INTEGER LB1, UB1;
INTEGER LB2, UB2;

LA1 := LOWERBOUND(A, 1); UA1 := UPPERBOUND(A, 1);
LA2 := LOWERBOUND(A, 2); UA2 := UPPERBOUND(A, 2);
LB1 := LOWERBOUND(B, 1); UB1 := UPPERBOUND(B, 1);
LB2 := LOWERBOUND(B, 2); UB2 := UPPERBOUND(B, 2);

CI := 1;
FOR I := LA1 STEP 1 UNTIL UA1 DO
FOR K := LB1 STEP 1 UNTIL UB1 DO
BEGIN
CJ := 1;
FOR J := LA2 STEP 1 UNTIL UA2 DO
FOR L := LB2 STEP 1 UNTIL UB2 DO
BEGIN
C(CI, CJ) := A(I, J) * B(K, L);
CJ := CJ + 1
END;
CI := CI + 1
END
END KRONECKERPRODUCT;
! --- EXAMPLE 1 --- ;
BEGIN
INTEGER ARRAY A(1:2, 1:2);
INTEGER ARRAY B(1:2, 1:2);
INTEGER ARRAY C(1:4, 1:4);

! {{1, 2}, {3, 4}} ;

A(1, 1) := 1;
A(1, 2) := 2;

A(2, 1) := 3;
A(2, 2) := 4;

! {{0, 5}, {6, 7}} ;

B(1, 1) := 0;
B(1, 2) := 5;

B(2, 1) := 6;
B(2, 2) := 7;

OUTMATRIX(A, 2); OUTTEXT(" *"); OUTIMAGE;
OUTMATRIX(B, 2); OUTTEXT(" ="); OUTIMAGE;

KRONECKERPRODUCT(A, B, C);

OUTMATRIX(C, 2); OUTIMAGE

! OUTPUT:

! [ 0 5 0 10]
! [ 6 7 12 14]
! [ 0 15 0 20]
! [18 21 24 28] ;

END EXAMPLE 1;

! --- EXAMPLE 2 --- ;
BEGIN
INTEGER ARRAY X(1:3, 1:3);
INTEGER ARRAY Y(1:3, 1:4);
INTEGER ARRAY C(1:9, 1:12);

! {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}} ;

X(1,1) := 0;
X(1,2) := 1;
X(1,3) := 0;

X(2,1) := 1;
X(2,2) := 1;
X(2,3) := 1;

X(3,1) := 0;
X(3,2) := 1;
X(3,3) := 0;

! {{1, 1, 1, 1}, {1, 0, 0, 1}, {1, 1, 1, 1}} ;

Y(1,1) := 1;
Y(1,2) := 1;
Y(1,3) := 1;
Y(1,4) := 1;

Y(2,1) := 1;
Y(2,2) := 0;
Y(2,3) := 0;
Y(2,4) := 1;

Y(3,1) := 1;
Y(3,2) := 1;
Y(3,3) := 1;
Y(3,4) := 1;

OUTIMAGE;

OUTMATRIX(X, 1); OUTTEXT(" *"); OUTIMAGE;
OUTMATRIX(Y, 1); OUTTEXT(" ="); OUTIMAGE;

KRONECKERPRODUCT(X, Y, C);

OUTMATRIX(C, 1); OUTIMAGE;
! OUTPUT:

! [0 0 0 0 1 1 1 1 0 0 0 0]
! [0 0 0 0 1 0 0 1 0 0 0 0]
! [0 0 0 0 1 1 1 1 0 0 0 0]
! [1 1 1 1 1 1 1 1 1 1 1 1]
! [1 0 0 1 1 0 0 1 1 0 0 1]
! [1 1 1 1 1 1 1 1 1 1 1 1]
! [0 0 0 0 1 1 1 1 0 0 0 0]
! [0 0 0 0 1 0 0 1 0 0 0 0]
! [0 0 0 0 1 1 1 1 0 0 0 0] ;

END EXAMPLE 2;
END</lang>
{{out}}
<pre>
[ 1 2]
[ 3 4]
*
[ 0 5]
[ 6 7]
=
[ 0 5 0 10]
[ 6 7 12 14]
[ 0 15 0 20]
[18 21 24 28]


[0 1 0]
[1 1 1]
[0 1 0]
*
[1 1 1 1]
[1 0 0 1]
[1 1 1 1]
=
[0 0 0 0 1 1 1 1 0 0 0 0]
[0 0 0 0 1 0 0 1 0 0 0 0]
[0 0 0 0 1 1 1 1 0 0 0 0]
[1 1 1 1 1 1 1 1 1 1 1 1]
[1 0 0 1 1 0 0 1 1 0 0 1]
[1 1 1 1 1 1 1 1 1 1 1 1]
[0 0 0 0 1 1 1 1 0 0 0 0]
[0 0 0 0 1 0 0 1 0 0 0 0]
[0 0 0 0 1 1 1 1 0 0 0 0]

</pre>
</pre>