tr(A) = a1,1 + a2,2 + ...+ an,n = Σaii, for all i = 1 to n
假如有兩個矩陣 A ∈ F(mxn), B∈F(nxm),則 tr(AB) = tr(BA)
以 C 程式實做如下:
#include<stdio.h> #include<stdlib.h> #define MSIZE 5 #define NSIZE 6 int main() { int m1[MSIZE][NSIZE], m2[NSIZE][MSIZE]; //mxn * nxm = mxm int result=0, tmp=0; int i=0,j=0,k=0; puts("<m1>"); /*initialize matrix 1*/ for(i=0; i<MSIZE; i++) { for(j=0; j<NSIZE; j++) { m1[i][j] = (i+1)*(j+1); printf("%d ",m1[i][j]); } puts(""); } puts("\n<m2>"); /*initialize matrix 2*/ for(i=0; i<NSIZE; i++) { for(j=0; j<MSIZE; j++) { m2[i][j] = (i+1)/(j+1); printf("%d ",m2[i][j]); } puts(""); } puts("");
/*(m1 第 m 列的第 n 個元素)*(m2 第 m 行第 n 個元素), 然後將 n 項乘積相加,成為新的矩陣的第 n 列 n 行項(對角項)*/ for(i=0; i<MSIZE; i++) {
for(k=0, tmp=0; k<NSIZE; k++) tmp += m1[i][k]*m2[k][i]; result += tmp; } /*更精簡的做法: for(i=0; i<MSIZE; i++) for(k=0; k<NSIZE; k++) result += m1[i][k]*m2[k][i]; 因為m1和m2行列乘積要相加才是對角項,接著又將對角項相加,因此可直接用result不斷相加 */ printf("tr(m1*m2)=%d\n",result); return 0; }
結果:
<m1>
1 2 3 4 5 6
2 4 6 8 10 12
3 6 9 12 15 18
4 8 12 16 20 24
5 10 15 20 25 30
<m2>
1 0 0 0 0
2 1 0 0 0
3 1 1 0 0
4 2 1 1 0
5 2 1 1 1
6 3 2 1 1
tr(m1*m2)=360
沒有留言:
張貼留言