随机生成的2-8可逆矩阵 并保存在文件中(C代码)

工作描述:       

        1、 动态规划方法生成2-8阶矩阵,保存在文件中。

        2、创建了一个文件,文件的内容是2-8阶的可逆矩阵,矩阵元素是利用随机数生成的,再求矩阵的行列式,将行列式值在1---pow(10,matrix_size)的矩阵写入文件,每个阶数的矩阵各50个。

        3、文件的每一行都是一个矩阵,每个矩阵的元素之间用空格分开。

为什么只生成2-8阶的可逆矩阵呢?

1、在生成可逆矩阵时,是利用随机数生成的,虽然随机数限制到了0-10之间,但是当矩阵维度增加时,矩阵的行列式的值增长过于快。如果取太大的行列式的矩阵,可能会在后续进行求逆运算或者验算的时候造成负担。

C代码实现

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>

//该代码是创建了一个文件,文件的内容是2-8阶的可逆矩阵,每个阶数的矩阵各50个。
//文件的每一行都是一个矩阵,每个矩阵的元素之间用空格分开。


void Write_to_file(FILE *fp);
float HlsCalculate(float **x,const int row,const int column);
int main(){
	FILE *fp;
	int i,j,k;

	//设置随机数
	srand((unsigned)time(NULL));
	
	fp = fopen("Array_Test_Document.txt","w");
	if (fp != NULL){
		Write_to_file(fp);
    	}else{
		printf("文件打开失败:\n");
	}

    fclose(fp);
    return 0;
}



//求行列式
float HlsCalculate(float **x,const int row,const int column){
	float hls = 0;
	float **c;
	int i,j,k;


	//动态分配二维数组
	c = (float **)malloc(sizeof(float *) * row);
	//分配列数
	for(j = 0;j < row;j++){
		c[j] = (float *)malloc(sizeof(float) * column);
	}

	//1阶2阶行列式计算
	if(row == 1){
		return x[0][0];
	}
	if(row == 2){
		float z = x[0][0]*x[1][1] - x[0][1]*x[1][0];
		//printf("2dimention hls= %f\n",k);
		return z;
	}



	//3阶以上求行列式
	for(j = 0;j < row ;j++){
		for(i = 0 ; i < column - 1;i++){
			for(k = 0 ; k < row - 1;k++){
				if(k<j)c[i][k] = (float)x[i+1][k];
				if(k>=j)c[i][k] = (float)x[i+1][k+1];
			}
		}
		hls += pow(-1,j)*x[0][j]*HlsCalculate(c,row-1,column-1);
	}
	//printf("原矩阵的行列式 = %f\n",hls);
	return hls;
}


//将行列式不为0的矩阵写入文件
void Write_to_file(FILE *fp){


	int i,j,k;
	i = 0;
	
	//矩阵的阶数
	int matrix_size;

	//接受随机数值的临时变量
	int  a;

	//count 用于记录每个维度的矩阵写入文件的个数
	int count;
	count = 0;


	do{
		//int matrix_size;
		//设置生成矩阵的维度
		matrix_size = 2;
		matrix_size += count / 50;
		
		 if(matrix_size == 9){
			break;
		}
		

		//动态分配一个二维数组
		float **p1;
		//分配行数
	        p1 = (float **)malloc(sizeof(float *) * matrix_size);
		//分配列数
		for(j = 0;j < matrix_size;j++){
			p1[j] = (float *)malloc(sizeof(float) * matrix_size);
		}
			
		//给数组中放入随机值
		for(j = 0;j < matrix_size;j++){
			for(k = 0;k < matrix_size;k++){
				//rand()%10 是设置数组中元素的值为0-10之间
				a = rand()%10;
				p1[j][k] = a;
			}
		}


		//求矩阵的行列式,如果行列式的绝对值在1 - pow(10,matrix_size)之间则将该数据写入文件
		//determinant 用于接受矩阵的行列式值
		float determinant;
		determinant = HlsCalculate(p1,matrix_size,matrix_size);
		if((determinant >= -pow(10,matrix_size) && determinant <= -1) ||
			(determinant <= pow(10,matrix_size) && determinant >= 1)){
			count ++;
			for(j = 0;j < matrix_size;j++){
				for(k = 0 ; k < matrix_size;k++){
					fprintf(fp,"%.2f",p1[j][k]);
					fprintf(fp," ");
				}
			}
			fputc('\n',fp);
		}
		free(p1);

	// matrix_size < 9 是指写入的可逆矩阵维度在2-8之间
	}while(matrix_size  < 9);  

}

生成的文件部分结果展示

在不同的编程语言中,有不同的方法来生成具有可逆矩阵随机矩阵,以下是一些示例: ### C语言 可以通过随机生成矩阵元素,然后判断矩阵是否可逆(通过求行列式),将行列式值在一定范围内的可逆矩阵保留。示例代码如下: ```c // 这里省略了部分代码,如矩阵行列式的计算函数等 // 假设已有计算行列式的函数 det // 生成随机可逆方阵保存文件 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> // 释放矩阵内存 void freeMatrix(int n, int** array) { int k = 0; for(k = 0; k < n; ++k) { free(array[k]); } free(array); } // 这里省略了计算行列式的函数 det int main() { srand(time(NULL)); FILE *fp = fopen("matrix_file.txt", "w"); if (fp == NULL) { return 1; } for (int matrix_size = 2; matrix_size <= 8; matrix_size++) { int count = 0; while (count < 50) { int **matrix = (int **)malloc(matrix_size * sizeof(int *)); for (int i = 0; i < matrix_size; i++) { matrix[i] = (int *)malloc(matrix_size * sizeof(int)); for (int j = 0; j < matrix_size; j++) { matrix[i][j] = rand(); } } double determinant = det(matrix, matrix_size); if (determinant >= 1 && determinant <= pow(10, matrix_size)) { // 写入文件 for (int i = 0; i < matrix_size; i++) { for (int j = 0; j < matrix_size; j++) { fprintf(fp, "%d ", matrix[i][j]); } fprintf(fp, "\n"); } fprintf(fp, "\n"); count++; } freeMatrix(matrix_size, matrix); } } fclose(fp); return 0; } ``` 上述代码创建了一个文件文件的内容是2 - 8阶的可逆矩阵矩阵元素是利用随机生成的,再求矩阵的行列式,将行列式值在1 - pow(10, matrix_size)矩阵写入文件,每个阶数的矩阵各50个[^2][^5]。 ### Python 可以通过自定义函数生成随机可逆的分块矩阵。示例代码如下: ```python from sympy import Matrix, diag def setDetMat(matlong, minVal, maxVal, minNum, maxNum, inver): # 这里省略了 setDetMat 函数的具体实现 pass def setChuMat(long=4, minVal=0, maxVal=10, minNum=-5, maxNum=10, inver=False, *args, **kwargs): """ 生成分块矩阵 :param long: 分块矩阵的长度 :param minNum: 分块矩阵包含的最小数 :param maxNum: 分块矩阵包含的最大数 :param inver: 是否可逆 :param args: :param kwargs: :return: 返回分块矩阵 """ x = long % 2 # 判断矩阵的行数是否为奇数 matlong = int(long / 2) y = long - matlong if x == 0: # 直接生成两个相同维度分块 chuMat = diag(setDetMat(matlong, minVal, maxVal, minNum, maxNum, inver), setDetMat(matlong, minVal, maxVal, minNum, maxNum, inver)) else: # 若矩阵的维度为基数,则用两个不同维度的可逆矩阵生成 chuMat = diag(setDetMat(matlong, minVal, maxVal, minNum, maxNum, inver), setDetMat(y, minVal, maxVal, minNum, maxNum, inver)) return chuMat # 示例调用 random_reversible_matrix = setChuMat() print(random_reversible_matrix) ``` 该函数可以生成分块矩阵,根据矩阵长度的奇偶性生成不同的分块矩阵,以实现随机可逆矩阵生成[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值