矩阵在形式上和行列式是一样 的,这两天看Mat,想起之前学历的行列式,那么我们如何求解一个矩阵对应的行列式的求解方法

行列式计算:

最简单的二维的行列式:

哈哈,上面是一个简单的计算的规则,希望你勾起你的青春的回忆

当然上面是二维和三维的,还有四维的甚至更高维度的

我们大概总结出来就是:某一行或者是某一列中的每一个元素乘以其对应的代数余子式的和

如何来求解代数余子式:

某一个元素对应的代数余子式,就是去掉这个元素所在的行和列,得到的行列式,称为改元素的代数余子式

代码:

首先我们使用Mat类创建一个矩阵:

创建上面的一个3x3的矩阵

首先我们求解的代数余子式

private static Mat Detsub(Mat mat, int i, int j) {// 删除行int rows = mat.rows();int cols = mat.cols();Mat tmp = mat.submat(0, i, 0, cols);Mat mat_result = mat.submat(i + 1, rows, 0, cols);tmp.push_back(mat_result);//删除列tmp = tmp.t();mat_result = tmp.submat(0, j, 0, rows - 1);tmp = tmp.submat(j + 1, cols, 0, rows - 1);mat_result.push_back(tmp);tmp.release();return mat_result.t();}

然后递归计算:

 // 矩阵行列式求值public static double Det(Mat mat) {// 单通道if (mat.channels() > 1) {throw new RuntimeException("Mat 对应的通道必须单通道");}// 并且是方阵if (mat.rows() != mat.cols()) {throw new RuntimeException("Mat 必须是方阵");}double sum = 0.0;// 矩阵的维度,也就是矩阵对应的行列式化简之后的结果if (mat.size().height == 2) {return mat.get(0, 0)[0] * mat.get(1, 1)[0] - mat.get(0, 1)[0] * mat.get(1, 0)[0];}for (int col = 0; col < mat.size().height; col++) {double a = mat.get(0, col)[0];if (col % 2 == 0) {double one = Det(Detsub(mat, 0, col));sum += a * one;} else {double two = Det(Detsub(mat, 0, col));sum -= a * two;}}return sum;}

开始计算:测试1

测试2:

为了检验结果的正确性,我从网上找了一个二维数组的列子,求解行列式值的例子:


class aij {// A函数可用于求余子阵int[][] A(int[][] a, int row, int column) {int[][] ans = new int[a.length - 1][a.length - 1];// ans用于储存返回的最终结果int[] temp = new int[(a.length - 1) * (a.length - 1)];// 临时一维数组temp用于按顺序储存剔除相应行和列元素后的数组int k = 0;// 剔除行和列并按顺序储存到temp内for (int i = 0; i < a.length; i++) {for (int j = 0; j < a[i].length; j++) {if (i == row - 1) {continue;} else if (j == column - 1) {continue;}temp[k++] = a[i][j];}}// 按顺序从temp中读取数据并储存到ans内k = 0;for (int i = 0; i < ans.length; i++) {for (int j = 0; j < ans[i].length; j++) {ans[i][j] = temp[k++];}}return ans;}// det用于求行列式int det(int[][] a) {if (a.length == 1) {return a[0][0];} else {int ans = 0;for (int i = 0; i < a.length; i++) {ans += a[i][0] * (int) Math.pow(-1, i) * det(A(a, i + 1, 1));}return ans;}}
}

可以看到的是两次的计算结果是一样的

希望对你有所帮助

OpenCv Java Mat的基本使用-行列式计算(6)相关推荐

  1. OPencv java Mat 基本操作像素点(7)

    前面我们说到了用Mat类进行行列式的计算,可能在OPenCv中不算太实用,那么今天我们介绍一个比较使用的,图片中的像素点 我们知道OpenCv当我们read一个图片的时候,返回的结果是一个Mat 一. ...

  2. openCv java Mat和MatOfByte的之间的相互转换 (4)

    因为opecncv是和图片打交道的,我个人觉得图片在计算机中存储的方式一般都是字节,Opecv中图片和矩阵之间是通过对象Mat产生的关联 我们很容易将图片转换成为Mat Mat src = Imgco ...

  3. Java OpenCV之Mat类的概述、常用构造方法、常用函数

    Java OpenCV之Mat类 概述 头部信息 数据类型 数据部分 Mat对象的构造方法 Mat() Mat(long addr) Mat(int row,int cols,int type) Ma ...

  4. java编程实现行列式计算应用,行列式算法(java)

    public class Arranger { private double[][] arrangerMatrix; private double arrangerResult=1.0; public ...

  5. OpenCV Java入门三 Mat的基本操作

    环境好了,我们就可以进入正文了. 在之前入门一.二中分别已经有画图的两个例子了.但没有细节展开我们的代码和OpenCV到底在干什么. 使用OpenCV时你需要补充的知识 你需要熟练使用Java Swi ...

  6. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  7. OpenCV Java入门五 结合摄像头识脸和拍照

    随着我们对环境.Mat基本使用越来越熟练.Java Swing也逐步熟悉了起来.今天我们开始进入OpenCV驱动摄像头的几个使用场景. 环境准备 准备好一个USB外接摄像头,我这边使用的有两种,一种是 ...

  8. OpenCV Java入门六 使用神经网算法辩识人脸

    介绍 前面几章我们积累了足够的opencv使用技巧.这一章我们就会进入最激动人心的辩识人脸.我们知道识脸和辩识人脸有着本质的区别. 识脸:这是一个人的脸. 辩识人脸:这是谁的脸,这才是我们需要的. 我 ...

  9. OpenCV Java 实现票据、纸张的四边形边缘检测与提取、摆正

    实习的公司有对增值税发票进行OCR识别的需求.OCR部分实现起来不难(有现成的SDK可以调用),但是实际情况中,用户提供的照片中的发票往往会有一些偏斜,而公司提供的OCR SDK并不能检测偏斜的字符, ...

最新文章

  1. 2015/6/1站立会议(补发)
  2. long转时间 unity_Unity3D如何获取时间戳或北京时间
  3. 树中点对距离(点分治)
  4. jacascript AJAX 学习
  5. 鼠标移动响应php程序,jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】...
  6. pta c语言 凯撒密码
  7. [JZOJ P1281] [DP]背包的第k优解
  8. MySQL--查询5天之内过生日的同事中的闰年2月29日问题的解决过程
  9. 《道德经》全文 (马王堆出土帛书版)
  10. node-red实现MQTT通讯
  11. RC电路时间常数的定义及计算
  12. 牛客练习赛63 B 牛牛的鱼缸
  13. 面向对象实验——solitaire纸牌游戏
  14. 2022年前端面试集锦
  15. 利用更快的r-cnn深度学习进行目标检测
  16. RAID磁盘阵列、mdadm、群晖软RAID
  17. IDEA推送本地代码到新远程git地址
  18. Python热点舆情数据挖掘
  19. iptables中的snat与dnat配置技术文档
  20. 边际电价计算matlab,PJM节点边际电价计算方法和其应用.PDF

热门文章

  1. 数据处理程序语言中的基本数据类型
  2. Centos6.3下利用open***部署远程×××服务
  3. 游戏开发--开源21---CroftSoft Code Library |Gibdo|JOGR...
  4. 转载:如何区分空间参考、坐标系统、投影、基准面和椭圆体?
  5. Win7屏幕键盘 在哪 使用
  6. 【万字长文】吃透负载均衡
  7. 怎么通过打工,在一线城市购买10套房?Snapchat程序员亲身分享经历!
  8. CPU深夜狂飙,一帮大佬都傻眼了...
  9. 某程序员炫耀:因长得太帅被女领导追求,三年就提拔到总监!程序员搞技术没用,健身护肤才是王道!...
  10. 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了