您的位置:首页 > 编程语言 > C语言/C++

C语言 矩阵的几种乘法

2011-12-29 23:59 936 查看
在看到麻省理工学院的线性代数公开课的视频时,了解到有几种矩阵相乘的方法:









#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]
=  {{5, 2,  4},
{6, 3,  9}};
float b
[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]
,b
[j]);
sumkeyval+=a[i]
*b
[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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: