matlab2c使用c++实现matlab函数系列教程-inv函数

全栈工程师开发手册 (作者:栾鹏)

matlab2c动态链接库下载
matlab库函数大全
matlab2c基础教程
matlab2c开发全解教程

matlab2c调用方法:

1、下载动态链接库
2、将Matlab2c.dll拷贝到exe同目录下
3、将Matlab2c.h、Matlab2c.lib放到项目头文件目录下
4、在cpp文件中引入下面的代码

#include "Matlab2c.h"
#pragma comment(lib,"Matlab2c.lib")  
using namespace Matlab2c;

matlab中inv函数简介

1、inv函数:求矩阵的逆
2、用法说明

 A=inv(B),其中B是输入的可逆矩阵,输出A就是B的逆矩阵,逆矩阵满足性质  AB=BA=E (E是单位阵)。如果输入的是不可逆矩阵会弹出警告,并返回inf

inv的c++源码实现

求矩阵的逆
输入:为可逆方矩阵 输出:矩阵的逆。不可逆时返回null

void swap(double *a,double *b);  //声明子程序
Matrix Matlab2c::inv(Matrix& a)
{
	if (a.row!=a.column)
	{
		throw_logic_error("求逆矩阵不为方阵");
		return NULL;
	}
	int *is,*js,i,j,k;
	int n=a.row;
	double temp,fmax;
	Matrix p(a.row,a.column);
	for(i=0;i<n;i++)
	{ 
		for(j=0;j<n;j++)
			p(i,j)=a(i,j);
	}
	is=new int[n];
	js=new int[n];
	for(k=0;k<n;k++)
	{
		fmax=0.0;
		for(i=k;i<n;i++)
			for(j=k;j<n;j++)
			{ 
				temp=std::fabs(p(i,j));//找最大值
				if(temp>fmax)
				{ 
					fmax=temp;
					is[k]=i;js[k]=j;
				}
			}
			if((fmax+1.0)==1.0)
			{  
				delete[] is;
				delete[] js;
				throw_logic_error("不存在逆矩阵");
				return NULL;
			}
			if((i=is[k])!=k)
				for(j=0;j<n;j++)
					swap(p.data+k*n+j,p.data+i*n+j);//交换指针
			if((j=js[k])!=k)
				for(i=0;i<n;i++)
					swap(p.data+i*n+k,p.data+i*n+j);  //交换指针
			p(k,k)=1.0/p(k,k);
			for(j=0;j<n;j++)
				if(j!=k)
					p(k,j)*=p(k,k);
			for(i=0;i<n;i++)
				if(i!=k)
					for(j=0;j<n;j++)
						if(j!=k)
							p(i,j)=p(i,j)-p(i,k)*p(k,j);
			for(i=0;i<n;i++)
				if(i!=k)
					p(i,k)*=-p(k,k);
	}
	for(k=n-1;k>=0;k--)
	{
		if((j=js[k])!=k)
			for(i=0;i<n;i++)
				swap((p.data+j*n+i),(p.data+k*n+i));
		if((i=is[k])!=k)
			for(j=0;j<n;j++)
				swap((p.data+j*n+i),(p.data+j*n+k));
	}
	delete[] is;
	delete[] js;
	return p;
}
void swap(double *a,double *b)
{  
	double c;
	c=*a;
	*a=*b;
	*b=c;
}

inv函数的使用测试

#include "Matlab2c.h"
#pragma comment(lib,"Matlab2c.lib")  
using namespace Matlab2c;


int main()
{
	double a[]={1,2,3,2,2,1,3,4,3};
	Matrix aa(3,3,a);
	Matrix bb = Matlab2c::inv(aa);
	cout<<bb.toString()<<endl;

	system("pause");
	return 0;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值