一个小型矩阵库
本文是一个小型的矩阵库,对做一些数学应用开发很有用 !!
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
FILE *fp;
/****************************************************************************************
*
* 关于一些用到的数学函数
*
****************************************************************************************/
/***************************************************************************************
*
* 数学函数--求整数的幂
*
****************************************************************************************/
int ipow(int i,int j)
{
int k,s=1;
for(k=1;k<=j;k++)
s=s*i;
return s;
}
/***************************************************************************************
*
* 数学函数--数组
*
****************************************************************************************/
int Kronecker(int x,int y,int z)
{
return (x*y==z)?1:0;
}
/***************************************************************************************
* <ds_matrix.h文件>
* 关于矩阵及其操作函数
*
* double Get(matrix m,int i,int j) ; 求矩阵特定位置元素值
* int Set(pmatrix pm,int i,int j,const double d); 给矩阵特定位置元素负值
* void DisplayM(matrix m); 输出矩阵
* matrix Sum(matrix m1,matrix m2); 求矩阵和
* matrix ZhuanZhi(matrix m); 矩阵转置
* double Det(matrix m); 用全选主元消去法求行列式的值
* matrix ShuCheng(matrix m,double d); 实现矩阵数乘
* matrix Multi(matrix m_A,matrix m_B); 实现矩阵乘法
* matrix ZLJ(const matrix m1,const matrix m2); 矩阵的张量积
* matrix Inv(matrix from); 矩阵求逆
* double NeiJi(matrix m1,matrix m2); 求两个向量的内积
* void FreeM(pmatrix pm) ; 释放矩阵内存
****************************************************************************************/
/***************************************************************************************
*
* 定义数据结构---矩阵
*
****************************************************************************************/
typedef struct tag_matrix
{
int hang;
int lie;
double * p;
}matrix;
typedef matrix* pmatrix;
/*声明用到的变量和函数*/
extern FILE *fp;
extern matrix I(int N);
/***************************************************************************************
*
* 求矩阵特定位置元素值
*
****************************************************************************************/
double Get(matrix m,int i,int j)
{
if(m.p==NULL||i>=m.hang||j>=m.lie)
{
printf("不能从矩阵中正确取值,可能是所给参数有误 !!/n");
fprintf(fp,"不能从矩阵中正确取值,可能是所给参数有误 !!/n");
return 0;
}
return *(m.p+i*m.lie+j);
}
/***************************************************************************************
*
* 给矩阵特定位置元素负值
*
****************************************************************************************/
int Set(matrix m,int i,int j,const double d)
{
if(m.p==NULL||i>=m.hang||j>=m.lie)
{
printf("不能正确付值,可能是所给参数有误 !!/n");
fprintf(fp,"不能正确付值,可能是所给参数有误 !!/n");
return 0;
}
*(m.p+i*m.lie+j)=d;
return 1;
}
/***************************************************************************************
*
* 输出矩阵
*
****************************************************************************************/
void DisplayM(matrix m)
{
int i,j;
fprintf(fp,"/n输出矩阵%d行%d列:/n",m.hang,m.lie);
for(i=0;i<m.hang;i++)
{
for(j=0;j<m.lie;j++)
{
fprintf(fp," %e",Get(m,i,j));
}
fprintf(fp,";/n");
}
}
void FreeM(pmatrix pm)
{
if(pm->p!=NULL)
{
pm->hang=0;
pm->lie=0;
free(pm->p);
pm->p=NULL;
}
}
/***************************************************************************************
*
* 求矩阵和
*
****************************************************************************************/
matrix Sum(matrix m1,matrix m2)
{
int i,j;
double d;
matrix m;
m.p=NULL;
if(m1.hang!=m2.hang||m1.lie!=m2.lie)
{
printf("所给矩阵行列数不相等,不能求和!!");
fprintf(fp,"所给矩阵行列数不相等,不能求和!!");
return m;
}
m.hang=m1.hang;
m.lie=m1.lie;
m.p=(double *)malloc(sizeof(double)*m.hang*m.lie);
for(i=0;i<m.hang;i++)
for(j=0;j<m.lie;j++)
{
d=Get(m1,i,j)+Get(m2,i,j);
Set(m,i,j,d);
}
return m;
}
/***************************************************************************************
*
* 矩阵转置