c语言math函数 sgn,常用矩阵计算C语言代码

参考资料:

行列式:http://zh.wikipedia.org/wiki/行列式#.E4.BB.A3.E6.95.B0.E4.BD.99.E5.AD.90.E5.BC.8F

伴随矩阵:http://zh.wikipedia.org/wiki/伴随矩阵

余因子矩阵:http://zh.wikipedia.org/wiki/余因子矩阵

逆矩阵:http://zh.wikipedia.org/wiki/逆矩阵

关于求一个矩阵的行列式,网上好多代码其实都是有问题的,我看到好多求行列式的代码都只是简单地把所有正对角线的元素乘起来再求和,然后在减去所有负对角矩阵的相应元素的乘积。这种方法在矩阵的阶大于等于4的时候是有问题的,漏掉了好多因子。正确的做法是参照行列式的定义,可以查看文章顶部的参考资料。

求矩阵行列式的正确代码如下:

//--------------------------------------------------------

//功能:求矩阵 n X n 的行列式

//入口参数:矩阵首地址 p;矩阵行数 n

//返回值:矩阵的行列式值

//--------------------------------------------------------

double determinant(double *p, int n)

{

int *list = new int[n];

for (int i = 0; i < n; i++)

list[i] = i;

double ret = det(p, n, 0, list, 0.0);

delete[] list;

return ret;

}

double det(double *p, int n, int k, int list[], double sum)

{

if(k >= n)

{

int order = inver_order(list, n);

double item = (double)sgn(order);

for (int i = 0; i < n; i++)

{

//item *= p[i][list[i]];

item *= *(p + i * n + list[i]);

}

return sum + item;

}

else

{

for(int i = k; i < n; i++)

{

swap(&list[k], &list[i]);

sum = det(p, n, k+1, list, sum);

swap(&list[k], &list[i]);

}

}

return sum;

}

void swap(int *a, int *b)

{

int m;

m = *a;

*a = *b;

*b = m;

}

//求逆序对的个数

int inver_order(int list[], int n)

{

int ret = 0;

for(int i = 1; i < n; i++)

for (int j = 0; j < i; j++)

if (list[j] > list[i])

ret++;

return ret;

}

int sgn(int order)

{

return order % 2 ? -1 : 1;

}

当然还可以用LU分解法来求,在矩阵的阶比较大时,用高斯消元法或者LU分解法求解具有一定的优势。

由于行列式是求矩阵的代数余子式的基础,代数余子式又是求矩阵的伴随矩阵的基础,求出伴随矩阵之后才可以求矩阵的逆矩阵。A矩阵的逆矩阵等于A矩阵的伴随矩阵除以A矩阵的行列式。

求矩阵某个元素的代数余子式的代码如下:

//----------------------------------------------------

//功能:求k×k矩阵中元素A(mn)的代数余子式

//入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k

//返回值: k×k矩阵中元素A(mn)的代数余子式

//----------------------------------------------------

double algebraic_cofactor(double *p, int m, int n, int k)

{

int len = (k - 1) * (k - 1);

double *cofactor = new double[len];

int count = 0;

int raw_len = k * k;

for (int i = 0; i < raw_len; i++)

if (i / k != m && i % k != n)

*(cofactor + count++) = *(p + i);

double ret = determinant(cofactor, k - 1);

if ((m + n) % 2)

ret = -ret;

delete[] cofactor;

return ret;

}

求伴随矩阵的代码如下:

//----------------------------------------------------

//功能:求k×k矩阵的伴随矩阵

//入口参数:m是k×k矩阵首地址;矩阵行数 k;输出参数adj是伴随矩阵的入口地址

//返回值: 无

//----------------------------------------------------

void adjoint_m(double *m, double *adj, int k)

{

int len = k * k;

int count = 0;

for (int i = 0; i < len; i++)

{

*(adj + count++) = algebraic_cofactor(m, i % k, i / k, k);

}

}

求逆矩阵的代码如下:

//----------------------------------------------------

//功能:求k×k矩阵的逆矩阵

//入口参数:m是k×k矩阵首地址;矩阵行数 k;输出参数inv是逆矩阵的入口地址

//返回值: 无

//----------------------------------------------------

void inverse_matrix(double *raw, double *inv, int k)

{

double det = determinant(raw, k); //求行列式

if (det == 0)

{

cout << "矩阵不可逆" << endl;

return;

}

adjoint_m(raw, inv, k); //求伴随矩阵

int len = k * k;

for (int i = 0; i < len; i++)

*(inv + i) /= det;

}

两个矩阵相乘的代码如下:

//--------------------------------------------------------

//功能:求矩阵a和b的相乘结果

//入口参数:矩阵首地址 a和b;矩阵a行数ra和列数rc;矩阵b的行数rb和列数cb

//返回值:矩阵a和b的相乘结果

//--------------------------------------------------------

double* m_multiply(double *a, double *b, double *c, int ra, int ca, int rb, int cb)

{

if (ca != rb)

{

cout << "矩阵不可乘" << endl;

return NULL;

}

double *ret = c;

if (NULL == ret)

{

ret = new double[ra * cb];

}

for (int i = 0; i < ra; i++)

for (int j = 0; j < cb; j++)

{

//double sum = a[i][0] * b[0][j];

double sum = *(a + i * ca) * (*(b + j));

for (int k = 1; k < ca; k++)

//sum += a[i][k] * b[k][j];

sum += *(a + i*ca + k) * (*(b + k*cb + j));

//c[i][j] = sum;

*(ret + i*cb + j) = sum;

}

return ret;

}

测试程序代码如下:

#include

#include "matrix.h"

using namespace std;

void main()

{

//double a[] = { 2, 6, 3, 1, 0, 2, 5, 8, 4 };

double b[] = { 1, 4, 7, 3, 0, 5, -1, 9, 11 };

double a[] = { -3, 2, -5, -1, 0, -2, 3, -4, 1 };

double det = determinant(a, 3);

cout << det << endl;

det = algebraic_cofactor(a, 1, 2, 3);

cout << det << endl;

double *adj = new double[9];

adjoint_m(a, adj, 3);

for (int i = 0; i < 9; i++)

cout << adj[i] << " ";

cout << endl;

double *c = m_multiply(a, b, NULL, 3, 3, 3, 3);

for (int i = 0; i < 9; i++)

cout << c[i] << " ";

cout << endl;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip: The ultimate package manager for Python

安装Package pip install <package name>列出已安装的Package pip list查看已安装的Package的详细信息 pip show <package name>搜索PyPi上的Package pip search <keyword>卸载已安装的Package pip uninstall <package name>转载于:https://www.cnblog…

python调用mysql数据库sql语句过长有问题吗_python连接MYSQL数据库,调用update语句后无法更新数据,解决...

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server&#xff0c;具有企业许可…

c语言结构体出现乱码,结构体数组输出时出现了乱码情况 求大神帮帮看程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#define N 3struct Student{int num;char name[20];int count;}; int useful_poll0;int useless_poll0;int total_poll0;int main(){void input(struct Student stu[]);void print(struct Student stu[]);struct S…

动态创建对象

C#主要支持 5 种动态创建对象的方式&#xff1a;   1. Type.InvokeMember   2. ContructorInfo.Invoke   3. Activator.CreateInstance(Type)   4. Activator.CreateInstance(assemblyName, typeName)   5. Assembly.CreateInstance(typeName)  最快的是方式 3 &…

python公式如何编写_如何编写 Python 程序,资深Python大咖教你玩转Python

如何编写Python程序&#xff0c;这从来就不是一件很难的事。下面我教你保存和运行 Python 程序的标准步骤&#xff0c;如下&#xff1a;对于 PyCharm 用户1. 打开 PyCharm。2. 以给定的文件名创建新文件。3. 输入案例中给出的代码。4. 右键并运行当前文件。注意&#xff1a;每当…

c语言学籍管理系统小程序,学籍业务办理系统(开源 v2.0发布 优化代码,增加小程序端)...

更新说明&#xff1a;1、此2.0版&#xff0c;大幅度优化代码&#xff0c;增加小程序端方便使用2、v1.0测试地址已关&#xff0c;请勿测试学生在校期间避免不了要和各种证明打交道&#xff0c;比如学籍证明、转专业申请、休学申请、退学申请等等。此类业务一般流程都是学生去找老…

Android 下的EXIF

一.什么是Exif Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式&#xff0c;它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息&#xff0c;包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件…

hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)

“Hill的加密与解密”Hill加密是另一种多字母代替密码&#xff0c;与多表代替密码不同的是&#xff0c;Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充)&#xff0c;每一个分组被整体的加密代换&#xff0c;即希尔密码属于分组加密。Hill密码的算法思想是…

python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理能力.jpg)...

为了在家安心学习&#xff0c;我决定写一段代码播放上课的铃声。之前中学时就希望有一个这样的软件&#xff0c;周末就可以高效学习了。但是网上搜不到相关软件&#xff0c;当时也不会写代码&#xff0c;就用闹钟来代替了。现在自己写一个试试。原本我是用C写的&#xff0c;但后…

那些地方会用C语言多线程,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

AWK高级编程 转载

AWK高级编程 转载 转载自&#xff1a;http://blog.csdn.net/wzhwho/article/details/5513791 1. 程序元素 一个awk 程序是一对以模式(pattern) 与大括号框起来的操作(action) 组合而成的&#xff0c;或许&#xff0c;还会加上实现操作细节的函数(function ) 。针对每个匹配于输…

tensor判断是否相等_PyTorch的Tensor(中)

背景在PyTorch的Tensor系列上一篇文章中&#xff1a;Gemfield&#xff1a;PyTorch的Tensor&#xff08;上&#xff09;​zhuanlan.zhihu.comGemfield介绍了一个Tensor的创建过程&#xff0c;特别是在创建一个Tensor的时候&#xff0c;调用栈从Python到C再回到Python的过程。与此…

c语言字符串未初始化strcat,C语言中字符串常用函数strcat与strcpy的用法介绍

strcpy原型声明&#xff1a;extern char *strcpy(char* dest, const char *src);头文件&#xff1a;#include 功能&#xff1a;把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明&#xff1a;src和dest所指内存区域不可以重叠且dest必须有足够的空间来容…

charles抓包工具使用指南

前言移动APP抓包PC端抓包查看模式其他功能问题汇总1、 前言&#xff1a; Charles是一款抓包修改工具&#xff0c;相比起burp&#xff0c;charles具有界面简单直观&#xff0c;易于上手&#xff0c;数据请求控制容易&#xff0c;修改简单&#xff0c;抓取数据的开始暂停方便等等…

android电视打印信息解析,关于液晶电视打印信息

原来是波特率的原因。。换了个波特率显示正常了&#xff0c;下面这个是红灯亮不开机的酷开k2打印信息&#xff0c;有老师能解释一下怎么看吗JHello world!{m3a} svn-r(Apr 2 2015 19:53:30)init_hwsetting_cpre_hwsetting_cpost_hwsetting_cparse hw setting DONE!internal ro…

bzoj1269 文本编辑器 splay

直接搞棵splay就行了&#xff0c;不要把光标弄到树中而是把光标当成询问或操作区间的端点标志这样会简单很多。 7点40分写到9点20分&#xff0c;包括调试总共花了一个小时40分钟&#xff0c;这次是自己独立调出来的&#xff0c;总算对splay有一定的了解。 设计操作&#xff1a;…

sap bom递归_SAP软件之化工行业特点01

作者&#xff1a;阿long声明&#xff1a;本文章仅用于SAP软件的应用、学习沟通&#xff0c;不代表SAP公司&#xff1b;文中所示截图来源SAP软件&#xff0c;相应著作权归SAP所有。SPA中关于制造的几种介绍2020.06.29简单的说&#xff0c;制造业中&#xff0c;生产管理是企业的组…

android 对话框 图片,android – AlertDialog按钮的图像

由于不推荐使用onPrepareDialog,因此您可以使用onShowListener.你也应该设置Drawable边界,或者它将被放置在最左边.下面的代码输出public class MyDialog extends DialogFragment {Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {final AlertDialog dialog…

并发事务正确性的准则 可串行化_从0到1理解数据库事务(上):并发问题与隔离级别...

最近准备写一篇关于Spanner事务的分享&#xff0c;所以先分享一些基础知识&#xff0c;涉及ACID、隔离级别、MVCC、锁&#xff0c;由于太长&#xff0c;只好拆分成上下两篇&#xff1a;上&#xff1a;并发问题与隔离级别主要讲事务所要解决的问题、思路&#xff0c;先理解为什么…

Windows 8.1 Windows Phone 开发环境安装遇到的问题

以前使用 Windows 8 开装 WP 8 的开发环境&#xff0c;很是顺利。 将系统升级到 Windows 8.1 后&#xff0c;先是安装了 Windows 8.1 旗舰本&#xff0c;安装后发现没有 Hyper-V 功能。 换成企业版&#xff0c;确定有 Hyper-V 功能后&#xff0c;安装 VS2010 WP8 SDK 后&#x…