在看到麻省理工学院的线性代数公开课的视频时,了解到有几种矩阵相乘的方法:
#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();}
来源:https://www.cnblogs.com/ikodota/archive/2011/12/29/matrix_MUL.html