2012年7月2日 星期一

Linear Algebra - Trace of 2 Matrices Multiply

在線性代數中,一個 n x n 矩陣 A 的 trace (跡) 等於該矩陣主對角線(最左上至最右下)上各個元素的總和,一般記作 tr(A) 或 Sp(A):

       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

沒有留言:

張貼留言