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(); }
相关文章推荐
- 基于Cuda的几种并行稀疏矩阵乘法方法(一)
- C语言实现矩阵乘法(4*5乘以5*3)
- Python 中的几种矩阵乘法 np.dot, np.multiply, *
- Numpy中的几种矩阵乘法 np.dot, np.multiply, *
- 分治策略之矩阵乘法的几种实现
- 软件设计师1991年下午试题2(C语言 压缩矩阵乘法)
- C语言 · 矩阵乘法
- C语言—用malloc函数实现任意阶矩阵的乘法
- 矩阵乘法的C语言实现
- Python中的几种矩阵乘法
- CUDA/GPU下矩阵乘法的几种实现的C++源码
- C语言科学计算入门之矩阵乘法的相关计算
- 线性代数笔记-矩阵乘法的几种求法
- C语言实现矩阵乘法
- C语言实现矩阵乘法
- C语言实现的矩阵乘法运算器
- 转置矩阵的分块并行乘法(C语言实现),计算矩阵C[rawn][rawn]=A[rawm][rawn]'*B[rawm][rawn],子块大小为S*T,其算法实现原理参加本代码的附件。
- Python 中的几种矩阵乘法 np.dot, np.multiply, *
- 复数矩阵乘法C语言实现
- 二维数组动态分配(c语言)之HWOJ矩阵乘法