复数矩阵计算行列式

项目上需要对复矩阵的行列式计算,根据计算一般矩阵行列式的代码改成了复矩阵行列式计算。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<fstream>
#include <iomanip>
using namespace std;

#define ROW 25
#define COL 25
typedef struct  
{
	float Real;
	float Image;
}Complex;


Complex add(Complex a,Complex b)
{
	Complex c;
	c.Real=a.Real+b.Real;
	c.Image=a.Image+b.Image;
	return c;
}
Complex sub(Complex a,Complex b)
{
	Complex c;
	c.Real=a.Real-b.Real;
	c.Image=a.Image-b.Image;
	return c;
}
Complex Mul(Complex a,Complex b)
{
	Complex c;
	c.Real=a.Real*b.Real-a.Image*b.Image;
	c.Image=a.Real*b.Image+b.Real*a.Image;
	return c;
}
Complex Div(Complex a,Complex b)
{
	Complex c;
	c.Real=(a.Real*b.Real+a.Image*b.Image)/(b.Real*b.Real+b.Image*b.Image);
	c.Image=(a.Image*b.Real-a.Real*b.Image)/(b.Real*b.Real+b.Image*b.Image);
	return c;
}
Complex matrix_det(const Complex *mat, int n)
{
    int i,j,k,is,js,l,v;
	Complex det;
	float flag,pivot,tmp;
    Complex *cpmat;
	Complex tempValue;
    if(mat == NULL)                            /* 检查输入的指针是否为空*/
    {
      printf("matrix pointer is NULL.\n");
    }
    cpmat = (Complex*)malloc(n*n*sizeof(Complex));  /* 将输入矩阵的内容拷贝一份,以免破坏*/
    for(i=0; i<n*n; i++)
      cpmat[i] = mat[i];
	det.Real = 1.0;                                 /* 设置行列式值初置*/ 
	det.Image=0.0;
	flag= 1.0;                                /* 这个变量原来记录行列式值的符号*/
    for(k=0; k<n-1; k++){           /* 最多进行n-1次消去*/     
    
		pivot = 0.0;                             /* 选择主元*/

		for(i=k; i<n; i++){
			for(j=k; j<n; j++){
				tmp = cpmat[i*n+j].Real*cpmat[i*n+j].Real+cpmat[i*n+j].Image*cpmat[i*n+j].Image;
				if(tmp > pivot){
					pivot = tmp;
					is = i;
					js = j;
				}
			}
		}
		if(pivot < 1e-5){                          /* 如果找到的主元小于eps,则认为是0。*/
			det.Real = 0.0;                             /*此时行列式值也是0。*/
			det.Image=0.0;
			return(det);
		} 
		if(is != k){                              /* 判断是否需要行交换*/
			flag = -flag;                          /* 行交换一次,行列式值变号*/
			for(j=k; j<n; j++){                     /* 进行行交换*/	
				l = k*n + j;
				v = is*n + j;
				tempValue = cpmat[l];
				cpmat[l] = cpmat[v];
				cpmat[v] = tempValue;
			}
      }
      if(js != k){                              /* 判断是否需要列交换*/
			flag = -flag;                          /* 列交换一次,行列式值变号*/
			for(i=k; i<n; i++){                     /* 进行列交换*/
				
				l = i*n + k;
				v = i*n + js;
				tempValue = cpmat[v];
				cpmat[v] = cpmat[l];
				cpmat[l] = tempValue;
			}
     }
     for(i=k+1; i<n; i++){                    /* 进行消去*/
		tempValue=Div(cpmat[i*n+k],cpmat[k*n+k]);   /* 记录下此值,减少除法的次数*/   
		for(j=k+1; j<n; j++) {                 /* 消去*/
			Complex aa;
			aa=Mul(tempValue,cpmat[k*n+j]);
			cpmat[i*n+j]=sub(cpmat[i*n+j],aa);
		}
	 }
      det = Mul(det,cpmat[k*n+k]);           /*更新det的值*/
    }
	det = Mul(det,cpmat[k*n+k]); /* 最终更新det的值*/
	det.Real=flag*det.Real;
	det.Image=flag*det.Image;
    free(cpmat);       
    return(det);
}

int main()
{
	Complex *inputdata;
	Complex result;
	inputdata=(Complex*)malloc(sizeof(Complex)*ROW*COL);
	ofstream myfile("example.txt");
	srand(time(0));
	for(int i=0;i<ROW*COL;i++){
		inputdata[i].Real=(float)rand()/10000;
		inputdata[i].Image=(float)rand()/10000;
	}
	//cout<<"[";
	myfile<<"b=[";
	for(int i=0;i<ROW;i++){
		for(int j=0;j<COL;j++){
			//cout<<inputdata[i*COL+j].Real<<"+"<<inputdata[i*COL+j].Image<<"i";
			myfile<<inputdata[i*COL+j].Real<<"+"<<inputdata[i*COL+j].Image<<"i";
			if(j<COL-1){
			//	cout<<",";
				myfile<<",";
			}
		}
		if(i<COL-1){
			//cout<<";";
			myfile<<";";
		}
		
	}
	//cout<<"]"<<endl;
	myfile<<"]"<<endl;;
	
	result=matrix_det(inputdata,ROW);
	//cout<<"Result:"<<endl;
	//cout<<result.Real<<"+"<<result.Image<<"i"<<endl;
	myfile<<setiosflags(ios::showpoint)<<result.Real<<"+"<<result.Image<<"i"<<endl;
	myfile<<flush;
	myfile.close();
	return 0;
}
计算结果与matlab计算对比,没有问题
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 线性代数中,矩阵行列式是密切相关的。行列式是一个数,而矩阵是一个矩形的数组。一个 n 阶方阵的行列式可以看作是该矩阵的 n 个行向量组成的矩阵行列式,也可以看作是该矩阵的 n 个列向量组成的矩阵行列式。此外,矩阵行列式为零,当且仅当该矩阵的行向量或列向量线性相关。 ### 回答2: 线性代数中的矩阵行列式有很密切的关系。首先,矩阵是由数字排列成的矩形表格,而行列式则是一个特殊的数值。矩阵中的每个数字称为矩阵的元素,行列式是由矩阵的元素进行运算得到的数值。 在线性代数中,矩阵可以用来表示线性变换、线性方程组和向量空间的映射等。而行列式则是矩阵的一个重要的性质。 对于一个n阶方阵,它的行列式是一个数,可以通过对矩阵中的元素进行特定的运算得到。行列式可以提供关于矩阵的一些重要信息,比如矩阵的可逆性、特征值和特征向量等。通过计算行列式,我们可以判断方阵是否可逆,进而判断线性方程组是否有唯一解或无解。 同时,行列式也可以用来计算矩阵的伴随矩阵、逆矩阵,以及求解高阶的线性方程组。行列式还可以用来求解线性方程组的Cramer法则,其中通过分别将未知数的系数矩阵替换为解向量列组成的矩阵,通过行列式的运算求解未知数。 总的来说,矩阵行列式是线性代数中的两个重要概念。矩阵可以用来表示线性变换和解决线性方程组问题,行列式则是对矩阵的一种特殊运算,可以提供关于矩阵的重要信息,并用于求解矩阵的逆矩阵和解线性方程组。 ### 回答3: 线性代数中的矩阵行列式是密切相关的概念。 首先,矩阵是由一组数按照规则排列成的一个矩形阵列。矩阵可以是任意大小,并且可以包含实数或复数等不同类型的数。矩阵中的元素按照行和列的顺序进行编号,例如一个m行n列的矩阵可以表示为A=[a_ij],其中i表示行号,j表示列号,a_ij表示矩阵A中第i行第j列处的元素。 行列式是一个特殊的函数,它将一个n阶的方阵映射到一个标量,通常用竖线包围矩阵的元素来表示,例如|A|。行列式的值可以用于判断矩阵是否可逆,以及描述线性变换的性质等。行列式的定义涉及到递归计算,包括求和与乘法等操作。 矩阵行列式之间存在着紧密的联系。特别地,给定一个n阶矩阵A,可以使用它的元素构建一个与A相关的n阶行列式。这个行列式通常被记作det(A),它由A的元素按照特定的顺序进行组合计算得到。矩阵行列式可以用来描述矩阵的很多性质,例如可逆性、特征值和特征向量等。行列式还可以用于解线性方程组、计算行列式的秩和相关矩阵的逆等。 总而言之,线性代数中的矩阵行列式是紧密相关的概念。矩阵是一种数据结构,行列式是一种通过矩阵元素组合计算得到的标量。行列式可以用于描述矩阵的性质,并且矩阵的元素可以用来构造与之相关的行列式。这种联系使得矩阵行列式成为线性代数中基础而重要的概念。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值