工作描述:
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);
}