一个小型矩阵库

                                                                        一个小型矩阵库

本文是一个小型的矩阵库,对做一些数学应用开发很有用 !!

#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;
}

/***************************************************************************************
*              
*                           矩阵转置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值