矩阵的乘法

0x00 C++版本

#include <bits/stdc++.h>using namespace std;
const int N = 25;
const double INF = 1e19;
const double EPS = 1e-6;struct Matrix
{int rowCount,colCount;double mat[N][N];
} e;
Matrix a,b;// 矩阵乘法
Matrix mat_mult(Matrix a,Matrix b)
{Matrix ans;for(int i = 0; i < a.rowCount; i++){for(int j = 0; j < b.colCount; j++){double tmp = 0;for(int k = 0; k < a.colCount; k++){tmp += a.mat[i][k] * b.mat[k][j];}ans.mat[i][j] = tmp;}}ans.rowCount = a.rowCount;ans.colCount = b.colCount;return ans;
}//矩阵转置
Matrix mat_transpose(Matrix a)
{Matrix res;for(int i = 0; i < a.rowCount; i++){for(int j = 0; j < a.colCount; j++){res.mat[j][i] = a.mat[i][j];}}res.rowCount = a.colCount;res.colCount = a.rowCount;return res;
}//读入矩阵
void read_mat(Matrix &a,int m,int n)
{a.rowCount = m;a.colCount = n;for(int i = 0; i < a.rowCount; i++){for(int j = 0; j < a.colCount; j++){cin>>a.mat[i][j];}}
}//矩阵打印
void print_mat(Matrix res)
{cout<<"-------------------"<<endl;for(int i = 0; i < res.rowCount; i++){for(int j = 0; j < res.colCount; j++){cout<<res.mat[i][j]<<" ";}cout<<endl;}
}//计算偏差
double calc_diff(Matrix Y)
{double diff = 0;for(int i = 0 ; i < Y.rowCount; i++){for(int j = 0; j < Y.colCount; j++){diff += fabs(Y.mat[i][j] - b.mat[i][j])/b.mat[i][j];}}return diff/Y.rowCount;
}
double diff = INF;
Matrix X,ans;void dfs(Matrix X,int n,int cnt,double sum)
{//可行性剪枝if(sum > 1.0 || (cnt == n&&sum != 1))return;if(cnt == n){Matrix res = mat_mult(a,X);double now_diff = calc_diff(res);if(diff - now_diff > EPS){diff = now_diff;ans = X;}return;}for (int j = 0; j <= 100; ++j){X.mat[cnt][0] = j / 100.0;dfs(X,n,cnt+1,sum+j/100.0);}
}int main()
{int m,n,x,y;cin>>m>>n;read_mat(a,m,n);//转置处理a = mat_transpose(a);cin>>x>>y;read_mat(b,x,y);//转置处理b = mat_transpose(b);X.rowCount = a.colCount;X.colCount = 1;dfs(X,a.colCount,0,0);cout<<"TargetX:"<<endl;print_mat(ans);cout<<"diff:"<<diff<<endl;cout<<"Y:"<<endl;print_mat(mat_transpose(mat_mult(a,ans)));return 0;
}
/*
3 3 21 2 -1
-1 3 4
1 1 15 6
-5 -6
6 0
*/
/*
res:
-11 -6
4 -24
6 0
*//*
4 2
2.89 0.376
3.18 0.272
2.49 0.393
3.28 0.3081 2
3.06 0.322
*/

0x01 java版本

package Demo;class Matrix{static int N = 25;int rowCount;int colCount;double [][] mat = new double[N][N];Matrix() {}Matrix(int rows,int cols,double[][] m) {rowCount = rows;colCount = cols;for(int i = 0; i < rowCount; i++) {for(int j = 0; j < colCount; j++){mat[i][j] = m[i][j];}}}Matrix(Matrix X) {rowCount = X.rowCount;colCount = X.colCount;for(int i = 0; i < rowCount; i++) {for(int j = 0; j < colCount; j++){mat[i][j] = X.mat[i][j];}}}
} public class BlendAlgorithm {Matrix a = new Matrix();Matrix b = new Matrix();Matrix X = new Matrix();//ans:各批的比例,Y:最佳勾兑后的结果Matrix ans = new Matrix();Matrix Y = new Matrix();static double INF = 1e19;static double EPS = 1e-6;double diff = INF;// 矩阵乘法Matrix matrixMultiply(Matrix a,Matrix b){Matrix ans = new Matrix();for(int i = 0; i < a.rowCount; i++){for(int j = 0; j < b.colCount; j++){double tmp = 0;for(int k = 0; k < a.colCount; k++){tmp += a.mat[i][k] * b.mat[k][j];}ans.mat[i][j] = tmp;}}ans.rowCount = a.rowCount;ans.colCount = b.colCount;return ans;}//矩阵转置Matrix matrixTranspose(Matrix a){Matrix res = new Matrix();for(int i = 0; i < a.rowCount; i++){for(int j = 0; j < a.colCount; j++){res.mat[j][i] = a.mat[i][j];}}res.rowCount = a.colCount;res.colCount = a.rowCount;return res;}//矩阵打印void printMatrix(Matrix res){System.out.println("------------------------");System.out.printf("rowCont=%d colCount=%d\n",res.rowCount,res.colCount);for(int i = 0; i < res.rowCount; i++){for(int j = 0; j < res.colCount; j++){System.out.printf("%f ",res.mat[i][j]);}System.out.println();}}//计算偏差double calcDiff(Matrix Y){//printMatrix(Y);double diff = 0;for(int i = 0 ; i < Y.rowCount; i++){for(int j = 0; j < Y.colCount; j++){diff += Math.abs(Y.mat[i][j] - b.mat[i][j])/b.mat[i][j];}}return diff/Y.rowCount;}//勾兑算法public void blend(Matrix X,int n,int cnt,double sum) {//可行性剪枝if(sum > 1.0 || (cnt == n && sum != 1.0)) {return;}if(cnt == n){Matrix res = matrixMultiply(a,X);double now_diff = calcDiff(res);if(diff - now_diff > EPS) {diff = now_diff;//ans = X是引用,这里要用重载的构造函数!!!ans = new Matrix(X);}return;}for (int j = 0; j <= 100; ++j){X.mat[cnt][0] = j / 100.0;blend(X,n,cnt+1,sum+j/100.0);}}//打印最终X结果矩阵void printAnswer() {System.out.println("*******************");System.out.println("TargetX:");printMatrix(ans);   System.out.println("*******************");System.out.println("diff:\n------------------------");System.out.println(diff);System.out.println("*******************");System.out.println("Y:");Y = matrixTranspose(matrixMultiply(a,ans));printMatrix(Y);}//测试public static void main(String[] args) {BlendAlgorithm f = new BlendAlgorithm();//4,2double[][] a = new double[][]{{2.89,0.376},{3.18,0.272},{2.49,0.393},{3.28,0.308}};f.a = new Matrix(4,2,a);//转置f.a = f.matrixTranspose(f.a);//f.printMatrix(f.a);//1,2double [][] b = new double[][] {{3.06,0.322}};f.b = new Matrix(1,2,b);//转置f.b = f.matrixTranspose(f.b);//f.printMatrix(f.b);f.X.rowCount = f.a.colCount;f.X.colCount = 1;f.blend(f.X,f.a.colCount,0,0);f.printAnswer();}
}

矩阵的乘法通用模板(C++/Java)相关推荐

  1. 6-2 编写Matrix类,使用二维数组实现矩阵,实现两个矩阵的乘法。 (30分) java pta

    编写程序题, 根据要求编写一个Java类,补充到代码中. 定义Matrix(矩阵)类,使用二维数组实现矩阵,实现两个矩阵的乘法.要求如下: 4个变量:row(行数),column(列数), matri ...

  2. 蓝桥杯JAVA-32.二维数组(矩阵)实现旋转模板(JAVA实现)

    个人博客 www.tothefor.com 蓝桥杯复习知识点汇总 目录 顺时针旋转 90° import java.io.*; import java.math.BigInteger; import ...

  3. java矩阵类_java矩阵类,矩阵的乘法

    问题如下 我采用的是3重循环,先计算的列的结果,应该还可以先计算行的结果,然后求出矩阵的乘法.没有过多的技巧,就是循环的使用. 相关的code package day20180728; import ...

  4. java矩阵加法_JAVA实现矩阵加法乘法

    矩阵运算库函数 请实现矩阵的基本运算库函数.该库函数包含矩阵的转置,矩阵与矩阵的加法,矩阵与矩阵的乘法等功能. 矩阵的转置即行列互换.矩阵的加法是对应元素相加.矩阵的乘法是对应行列的点积. 感兴趣的同 ...

  5. springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel

    springboot使用jxls导出excel 实现思路: 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口 ...

  6. android通用模板项目AndroidTemplate

    AndroidTemplate                                                                                    - ...

  7. html模板字幕,HTML通用模板

    xxx *{margin: 0px;padding: 0px;} a{text-decoration: none;color: #333;} ul,li{list-style: none;} body ...

  8. Windows PE变形练手3-把通用模板机器码直接覆盖目标PE

    把通用模板机器码直覆盖目标PE 这个地方真是尝试了好久,遇到很多坑点,Win PE那本书上的东西有点不够,也就直接写书上的例子会发现很多地方不是说的那样,里面提供的信息太少了,就比如里面并没有提被注入 ...

  9. C++设计模式--单例模式(Singleton)及单例通用模板

    概述 C++中的单例模式应该是设计模式中最简单的了,在编码中常见到.那么,简单的总结下 C++中的单例模式写法,以及根据单例模式扩展后的一些写法,最后还有单例的通用模板,可用于快捷创建一个单例类. 单 ...

最新文章

  1. 1.6 文件上传组件
  2. 四大微博OAuth认证
  3. ScalavsKotlin
  4. homebrew mac_借助Homebrew使从Mac到Linux的转换更加容易
  5. 发邮件请领导审批文件怎么说_住建部:1月1日起,两项甲级资质实行告知承诺审批!...
  6. ZooKeeper学习第一期---Zookeeper简单介绍
  7. C++公有、私有、保护继承的关系
  8. MyBatis学习总结[5]-动态 SQL
  9. Java读取Rinex 2.11格式的观测值o文件
  10. 有用的各大网站论坛,学习、娱乐、生活...
  11. 表格里面如何快捷给方框内打勾
  12. 酒店管理系统--C语言版
  13. 深度 | 苹果略胜微软一筹,为什么说 ARKit 是 AR 的最好选择?
  14. dlopen failed: empty/missing DT_HASH in quot;libx.soquot; (built with --hash-style=gnu?)
  15. 惟实励新·笃行致远,艾特网能2022年度合作伙伴大会成功举办
  16. C语言 输入三个字符串,由小到大输出
  17. python登录网易163邮箱,爬取邮件
  18. 基于QT的多线程视频监控的实现(一)
  19. Fragment has not been attached yet 解决方法及源码详解
  20. 领扣问题1. 两数之和领python解决方案

热门文章

  1. 怎么更新android 10.0,Android 10.0(Q OS)系统升级计划Androi
  2. matlab怎么把变量一起换掉,MATLAB只是简单地把表达式里的变量名替换成数值,而不给出结果...
  3. SSL/TLS协议运行机制的概述
  4. Hive DML操作
  5. 盘点国内互联网圈中程序员出身的商业大佬,看谁主沉浮!
  6. 抢票神器成GitHub热榜第一,支持候补抢票,Python跑起来 | 标星8400
  7. linux python软连接_Linux软链接的创建,删除,修改
  8. python离散余弦变换_在python3下使用OpenCV做离散余弦变换DCT及其反变换IDCT
  9. java中toarray()的 用法_java容器中toArray的用法
  10. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-梯度下降算法概述-03