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        
#include
#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("");
/*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");
/*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;

結果:


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


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

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s