复数矩阵计算行列式

2023-11-11

项目上需要对复矩阵的行列式计算,根据计算一般矩阵行列式的代码改成了复矩阵行列式计算。
#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计算对比,没有问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复数矩阵计算行列式 的相关文章

  • 侯捷系列:c++面向对象高级编程(上)

    文章目录 基于对象的程序设计 不带有指针成员变量的类 以复数类 Complex 为例 头文件的结构 访问级别 函数设计 内联函数 构造函数 常量成员函数 参数的值传递和引用传递 返回值的值传递和引用传递 友元 操作符重载 在类内声明 pub
  • C++知识积累:内存对齐理解

    为什么要进行内存对齐 这是因为CPU的读取总是对齐的 举个例子 假设CPU是32位的 那么CPU每次读取的4字节数据的首地址都是4的倍数 也就是说 内存中数据首地址为4的倍数时 CPU一次操作就可以完成数据读取 假设有一个int型四字节大小
  • SQL 查询指定行数的数据。

    今天遇到一个关于 查询指定行数的数据 的sql查询语句问题 突然发现以前没怎么接触过 刚才想起来了 赶紧看了下文档 又上网搜了下 有了下面的东西 不知道有没有什么地方不对 oracle 先看一下文档中关于any和all的例子 很不错噢 An
  • Qt5学习之路(vs2012下创建一个QT应用程序)2013-10-14

    刚开始学习QT在网上找的资料基本都是使用QT Create进行开发的 VS下开发的学习资料感觉很少很难找的到 视频教程也基本没看到过貌似 因为我们研发中心是使用MFC进行开发开发工具是VS2010 使用QT开发的话基本我们不会再使用QT C
  • C语言pcre库的使用及验证IP地址的合法性

    PCRE是一个用C语言编写的正则表达式函数库 它十分易用 同时功能也很强大 性能超过了POSIX正则表达式库和一些经典的正则表达式库 在使用PCRE库时 首先肯定是需要安装pcre的 不过一般的系统都会有自带的PCRE库 不过如果想使用最新
  • Vc/MFC中自定义消息及其PostMessage触发使用

    http blog csdn net ztz0223 article details 2058402 http blog csdn net a8082649 article details 7733527 http bbs csdn net
  • 写时拷贝技术(copy-on-write)

    传统的fork 系统调用直接把所有的资源复制给新创建的进程 这种实现过于简单并且效率低下 因为它拷贝的数据也许并不共享 更糟的情况是 如果新进程打算立即执行一个新的映像 那么所有的拷贝都将前功尽弃 Linux的fork 使用写时拷贝 cop
  • 简析多级指针解引用

    转自 简析多级指针解引用 指针是C语言中公认的最为强大的语法要素 但同时也是最难理解的语法要素 它曾给程序员带来了无数麻烦和痛苦 以致于在C语言之后诞生的很多新兴 语言中我们再也难觅指针的身影了 下面是一个最简单的C语言指针的例子 int
  • 值得学习与推荐的c/c++框架和函数库

    这几天不上班 翻翻Evernote中记录的一些笔记 刚好有时间把记录的一些好玩链接转载一下 这篇文章里提到的很多库都用过 尤其是图像处理相关库 尤其是opencv及cximage 当时做图像算法时 很多算法就是从上面找来 然后自己修改的 比
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • C++学习笔记12:输入输出流实例整理(文本文件读写,二进制文件读写,一组数据的文件读写,随机访问文件实例

    这也太难记了555老阔疼 文件读写示例 include
  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • 【C/C++】 - Linux下查找函数头文件 以及 man命令拓展

    背景 比如现在需要找C语言 sleep函数的头文件 使用man来查找 可以先man sleep 可以发现出来的默认是sleep 1 是一个User Commands 明显不是我们需要的 这里提示了 看sleep 3 那我们查看下sleep
  • visual studio 一直显示正在准备解决方案

    首先重启电脑 无法解决的情况下执行以下步骤 Kill Visual Studio Open Visual Studio without loading a solution Disable AnkhSvn as Source Control
  • 一个简单的参数帮助框架,c实现

    文章目录 具体实现如下 include
  • enable_shared_from_this使用介绍

    文章目录 enable shared from this定义 使用场合 源码实现 注意 enable shared from this定义 定义于头文件 template lt class T gt class enable shared
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序

随机推荐