矩阵的转置和行列式等操作的c语言实现

          矩阵的转置和行列式等操作的c语言实现,是我当初练习C语言时写的一个小程序,这个程序是按线性代数上的讲解直接转化来编写的,其实好多软件都自带求解矩阵的库,比如OpenCV,Matlab等,也有些一些标准库如C++ Eign库,砸门自己写的一般绝对是没有这些库函数运行效率高的,更何况是采用这种直接转化的方式,这么做似乎有些闭门造车了,当然对于某些人来说这些确实没必要,但也总会有些人会去尝试理解或知道这个求解矩阵行列式的详细过程,想想当初世界上还没有求解矩阵行列式的程序的时候,第一个编写求解矩阵行列式的人就是上面说的有些人吧。知道处理一个问题的过程就是一种思想方法,虽然这种方法在目前在计算机上编程效率等还不高,但是它给我们了一种思想。比如求解线性方程组的解,在理论上有一个通用的方法:克拉默法则。这个方法是如此的简洁明了,以至于我当时学习线性代数时很大感触,简洁才是事物的本质。这个法则一目了然知道方程组的某个解和其系数矩阵行列式的一些关系。但是这个方法在目前计算机上运算是巨大的,想想当有一台量子计算机出现了,这个问题可能就迎刃而解了,因此到那时你直接编写一个克拉默法则求解方程组的解就行了,这样程序是多么的简练易读啊,再也不用为了加速绞尽脑汁设计一些千奇百怪的算法了。人总是有惰性的,加之当前AI热潮涌起,不知道那时人还爱不爱思考了,没有思想的人也许很可拍吧,.........,离题十万八千里,现在回到正路上。

        1、 矩阵的转置,就是矩阵行列对调。

         2、矩阵的行列式,等于某一行(列)的元素乘上对应的代数余子式之和。

         3、矩阵的逆等于其转置伴随矩阵除以其行列式。(实际一般用高斯消元和单位矩阵联合求解,快呀)

        有些说明加注在程序中,在此不多说了。看程序:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<assert.h>

int** inputmatrix(int m, int n)
{
	int i, j;
	int** A = (int**)malloc(sizeof(int*)*m);
	for (i = 0; i < m; i++)
	{
		A[i] = (int*)malloc(sizeof(int)*n);
	}
	printf("输入矩阵所有元素:\n");
	for (i = 0; i < m; i++)
	for (j = 0; j < n; j++)
		scanf_s("%d", &A[i][j]);
	return A;
}

//矩阵的转置
void MatrixTranspose(int m, int n, int**a)
{
	int i, j, temp;
	//行列元素互换
	for (i = 0; i < m; i++)
	for (j = i; j < n; j++)
	{
		temp = a[i][j];
		a[i][j] = a[j][i];
		a[j][i] = temp;
	}
	//打印转置后的元素
	printf("转置后的矩阵元素:\n");
	for (i = 0; i < m; i++)
	for (j = 0; j < n; j++)
	{
		if ((j + 1) % n)
			printf("%d ", a[i][j]);
		else
			printf("%d\n", a[i][j]);
	}
}

//计算矩阵的转置伴随矩阵的一个元素
int CalculateTransposeAccoompanyElement(int m, int n, int I, int J, int** a)
{
	int k, j, i;
	int** b = (int**)malloc(sizeof(int*)*m);
	for (i = 0; i < m; i++)
	{
		b[i] = (int*)malloc(sizeof(int)*n);
	}
	int sum = 0, offsetR = 0, offsetC = 0;
	if (n == 1)
		return a[0][0];
	for (i = 0; i < n - 1; i++)
	{
		if (i < I)
			offsetR = 0;
		else
			offsetR = 1;
		for (j = 0; j < n - 1; j++)
		{
			if (j < J)
				offsetC = 0;
			else
				offsetC = 1;
			b[i][j] = a[i + offsetR][j + 1];
		}
	}
	//计算转置矩阵中的每一个元素
	sum = sum + pow(-1.0, I + J)*CalculateTransposeAccoompanyElement(m - 1, n - 1, I, J, b);
	return sum;
}

//计算矩阵的转置伴随矩阵
int** MatrixTransposeAccoompany(int m, int n, int** a)
{
	int i, j, I, J;
	int** c = (int**)malloc(sizeof(int*)*m);
	for (i = 0; i < m; i++)
		c[i] = (int*)malloc(sizeof(int)*n);
	for (I = 0; I < m; I++)
	for (J = 0; J < n; J++)
		c[I][J] = CalculateTransposeAccoompanyElement(m, n, I, J, a);
	return c;
}

//矩阵的行列式
int MatrixDet(int m, int n, int** a)
{
	int k, j, i;
	//预分配二维数组内存
	int** b = (int**)malloc(sizeof(int*)*m);
	for (i = 0; i < m; i++)
	{
		b[i] = (int*)malloc(sizeof(int)*n);
	}
	int sum = 0, offset = 0;
	//递归结束位置
	if (n == 1)
		return a[0][0];
	for (k = 0; k < n; k++)
	{
		for (i = 0; i < n - 1; i++)
		{
         //例如:当计算第i行第1列的代数余子式时,要划掉第i行和第1列所有元素,
		//故0至(i-1)行,1至(n-1)列,原封不动搬到b数组中去
			if (i < k)
				offset = 0;
			else
				offset = 1;
			for (j = 0; j < n - 1; j++)
				b[i][j] = a[i + offset][j + 1];
		}
		//矩阵的行列式等于某一行(列)的元素乘上对应的代数余子式之和;
		//此处按矩阵的第一列展开,即第一列元素乘上其代数余子式之和
		sum = sum + a[k][0] * pow(-1.0, k + 0)*MatrixDet(m - 1, n - 1, b);
	}
	return sum;
}


void main()
{
	int m, n, i, j;
	printf("请输入矩阵的行和列(行列必须相同)\n");
	scanf_s("%d %d", &m, &n);
	assert(m == n);
	int** A = inputmatrix(m, n);
	//矩阵转置
	MatrixTranspose(m, n, A);
	//矩阵行列式
	int result = MatrixDet(m, n, A);
	printf("矩阵的行列式为: %d\n", result);
	system("pause");
}



  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值