C語言 矩陣的幾種乘法

來源:互聯網
上載者:User

在看到麻省理工學院的線性代數公開課的視頻時,瞭解到有幾種矩陣相乘的方法:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define M 2
#define N 3
#define P 4
/*
* A*B=C
* (M,N) * (N,P) =(M,P)
*/
float a[M][N] = {{5, 2, 4},
{6, 3, 9}};
float b[N][P] = {{7, 8, 9, 10},
{1, 4, 22, 171},
{13,14, 2, 21}};
float c[M][P];



void clear_c()
{//用於清空c數組,
//多種乘法同時使用的時候,某些方法需要清空c數組,否則會重複計算。
int i,j;
for(i=0;i<M;i++)
for(j=0;j<P;j++)
c[i][j]=0;
}
void print_matrix()
{//本函數只列印c 矩陣
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<P;j++)
{
printf("%.3g\t",c[i][j]);
}
printf("\n");
}
}
void mul_1()
{//一般矩陣乘積

printf("\n1.矩陣乘法的一般方法:\n");
int i,j,k;
float c_key,c_sumkey;

//注意三層迴圈的順序。
for(i=0;i<M;i++){
for(j=0;j<P;j++){
c_sumkey=0;//清空後計算下一個元素的值
for(k=0;k<N;k++){
c_key=a[i][k]*b[k][j];
c_sumkey+=c_key;
printf("a[%d,%d] x b[%d,%d] = %.3g x %.3g = %.3g\n",i,k,k,j,a[i][k],b[k][j],c_key);
}
c[i][j]=c_sumkey;
printf("相加 = c[%d,%d] = %.3g\n\n",i,j,c_sumkey);
}
}


}

float get_key_val(int i,int j)
{ //求結果矩陣中某點的內積
int n;
float sumkeyval=0;

printf("c[%d,%d] = ",i,j);
for(n=0;n<N;n++){
if(n!=0) printf(" + ");
//printf("a[%d,%d]*b[%d,%d]",i,n,n,j);
printf("(%.3g*%.3g)",a[i][n],b[n][j]);
sumkeyval+=a[i][n]*b[n][j];
}
printf(" = %.3g\n",sumkeyval);


return sumkeyval;
}
void mul_2()
{//根據定義求矩陣的乘積
printf("\n2.根據定義直接計算:\n");
int i,j;
for(i=0;i<M;i++){
for(j=0;j<P;j++){
c[i][j]=get_key_val(i,j);
}
printf("\n");
}
}

void show_multi_proc(float x,int j)
{//本函數只為顯示更詳細的乘法過程。
int k;
if(j!=0){printf(" + ");}else{printf(" = ");}
printf("[ ");
for(k=0;k<P;k++)
{
printf("%.3g ",x*b[j][k]);

}
printf("]");
}
void splite_matrix_row(float x,int i,int j)
{//把B矩陣分割成 N個一維數組,長度為p.
//並用向量 乘以 數組中的每個值。
//然後做矩陣相加,即多個一維數組對應位置相加。並把值寫入C矩陣。
int k;
if(j!=0){printf("\n + ");}
printf("%.3g*[ ",x);
for(k=0;k<P;k++)
{
printf("%.3g ",b[j][k]);
c[i][k]+=x*b[j][k];//向量乘以矩陣
}
printf("]");


}


void mul_3()
{//係數-向量方法
//這裡只採用了 行向量的方法。列向量也會可行的。
// 或者 把矩陣A分為多個行(列)向量,然後把矩陣B分為係數。
printf("\n3.係數-向量的方法:\n");
int i,j;
float xs;//係數
for(i=0;i<M;i++){
for(j=0;j<N;j++)
{
xs=a[i][j];
splite_matrix_row(xs,i,j);
}
for(j=0;j<N;j++)
{
xs=a[i][j];
show_multi_proc(xs,j);
}

printf("\n");
}

}


void mul_4()
{//行向量與列向量相乘。計算結果為最終矩陣中一個元素的值
printf("\n4.行向量乘以列向量的方法:\n");
int i,j,k;
float c_key,c_sumkey;

//注意三層迴圈的關係。
for(i=0;i<M;i++){
for(j=0;j<P;j++){
c_sumkey=0;//清空後計算下一個元素的值


printf("[");
for(k=0;k<N;k++){
printf(" %.3g ",a[i][k]);
}
printf("].");

printf("[");
for(k=0;k<N;k++){
printf(" %.3g ",b[k][j]);
}
printf("] =");

for(k=0;k<N;k++){
if(k!=0){printf("+ ");}
c_key=a[i][k]*b[k][j];
c_sumkey+=c_key;
printf("%.3g x %.3g ",a[i][k],b[k][j]);
}
c[i][j]=c_sumkey;

printf("= c[%d,%d] = %.3g\n\n",i,j,c_sumkey);
}
}

}


int main()
{


mul_1();
print_matrix();
mul_2();
print_matrix();

clear_c();
mul_3();
print_matrix();

mul_4();
printf("\n");
print_matrix();

}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.