矩阵运算库

转载 2004年09月27日 15:44:00

#ifndef _MATRIX_H_
/********************************
*    matrix.h *
* 矩阵运算库 *
* edit 2004-8-9 *
* 版本1.0 *
*********************************
矩阵计算的几个函数
atV计算转置
abV计算a×b
abaddV计算a+b
absubV计算a-b
inputaV输入矩阵
printaV输出矩阵
求逆
int a_1V(double *in,double *out,int n)
转置
int atV(double *in,double *out,int m,int n)
矩阵相乘
int abV(double *a,double *b,double *out,int am,int an,int bm,int bn)
矩阵相加
int abaddV(double *a,double *b,double *out,int m,int n)
矩阵相减
int absubV(double *a,double *b,double *out,int m,int n)
输出
printaV(double *a,int m,int n)
输入
inputaV(double *a,int m,int n)
*/

/* 转置一个矩阵,矩阵存在一个一维数组in中,输出也存在一个一维数组out
矩阵列数和维数由n指定,
调用可以使用数组,例
二维数组调用方式
atV(double in[n][n],double out[n][m],int m,int n)
一维调用方式
atV(double in[k],double out[k],int m,int n)
指针调用方式
atV(double *in,double *out,int m,int n)
*/
#include <malloc.h>
#include <math.h>

int atV(double *in,double *out,int m,int n)
{
  int i,j;

  for(i=0;i<m;i++)
  {
   for(j=0;j<n;j++)
   *(out+ j*m +i)=*(in+ i*n +j);
  }

  return 1;
}


/* 矩阵相乘
out
am an 为矩阵a的行数和列数
bm nn 为矩阵b的行数和列数
矩阵列数和维数由n指定
调用可以使用数组,例
二维数组调用方式
avV(double a[am][an],double b[bm][bn],double out[am][bn],int am,int an,int bm,
int bn)
一维调用方式
avV(double a[k],double b[l],double out[j],int am,int an,int bm,int bn)
指针调用方式
avV(double *a,double *b,double *out,int am,int an,int bm,int bn)
*/


int abV(double *matrixa,double *matrixb,double *out,int am,int an,int bm,int bn)
{
  int i,j,k;
  double temp;
  if(an!=bm) {return 0;} /*矩阵不可以计算*/
  for(i=0;i<am;i++)
  {
    for(j=0;j<bn;j++)
    {
      for(k=0,temp=0;k<an;k++)
      temp=temp + *(matrixa+i*an+k) * *(matrixb+k*bn+j);
      *(out+i*bn+j) = temp;
    }

  }
  return 1;
}

/*输入一个m*n的矩阵,也可以输出m*n数组以及一维数组按m*n输出*/
int inputaV(double *matrixa,int m,int n)
{
  int i,j;
  for(i=0;i<m;i++)
  {
    printf("请输入第%d行/n",i+1);
    for(j=0;j<n;j++)
   {
      scanf("%lf",(matrixa+i*n+j));
   }

  }
  return 1;
}

/*输入一个m*n矩阵,也可以输出m*n数组以及一维数组按m*n输出*/
printaV(double *matrixa,int m,int n)
{
  int i,j;
  for(i=0;i<m;i++)
  {
    for(j=0;j<n;j++)
    printf("%lf ",*(matrixa+i*n+j));
    printf("/n");
  }
  printf("/n");
}


void initiones(double *q,int n)  /*形成单位矩阵*/
{
  int i,j;
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    { if(i==j)
           q[i*n+j]=1;
       else
           q[i*n+j]=0;
    }
}


void swap(double *r,int i,int line,int n)  /*换行*/
{
  int j;
  double m;
  for(j=0;j<n;j++)
  { m=r[i*n+j];
    r[i*n+j]=r[line*n+j];
    r[line*n+j]=m;
  }
}

int solve(double *p,double *q,int n)   /*形成下三角矩阵*/
{
  int i ,j,k,m,line;
  double max,temp,savep;
  for (i=0;i<n;i++)
   { max=fabs(p[i*n+i]);
     temp=p[i*n+i];
     line=i;
    for (j=i+1;j<n;j++)
    { if( fabs(p[j*n+i]) > max )  /*找出绝对值最大元*/
       {line=j;
         max=fabs(p[j*n+i]);
         temp=p[j*n+i]; }
    }
  if(max<=1e-5)  /*三角矩阵的对角元等于0则无解*/
       {
       return 0;}
  if(line!=i)
    { swap(p,i,line,n);
      swap(q,i,line,n);}
  for (k=0;k<n;k++)
     {p[i*n+k]/=temp;
      q[i*n+k]/=temp;}
   for(k=i+1;k<n;k++) /*消元,成下三角阵;*/
   { savep=p[k*n+i];
      for( m=0;m<n;m++)
    { q[k*n+m]=q[k*n+m]-q[i*n+m]*savep;
      p[k*n+m]=p[k*n+m]-p[i*n+m]*savep;}
   }
  }
  return 1;
}
void backloop(double *p,double *q,int n)  /*回带,形成单位矩阵*/
{
  int i,j,k;
  double savep;
  for(i=n-1;i>0;i--)
 {
   for(j=i-1;j>=0;j--)
   {
      savep=p[j*n+i];
      p[j*n+i]=p[j*n+i]-p[i*n+i]*savep;
      for(k=0;k<n;k++)
       q[j*n+k]=q[j*n+k]-q[i*n+k]*savep;

   }
 }

/*求a的逆阵,in为输入阵,out为输出的逆阵,n为维数*/
int a_1V(double *in,double *out,int n)
{
  double *p;
  int i,j;
  p=(double *)malloc(sizeof(double)*(n*n));
  for(i=0;i<n;i++)
  for(j=0;j<n;j++) p[j*n+i]=in[j*n+i];
  initiones(out,n);
  if(!solve(p,out,n)) {return 0;}
  backloop(p,out,n);
  return 1;
}
/*求矩阵和,a,b为输入阵,out为和的矩阵,m,n为行和列*/
int abaddV(double *matrixa,double *matrixb,double *out,int m,int n)
{
  int i,j;
  for(i=0;i<m;i++)
  {
   for(j=0;j<n;j++)
    *(out+i*n+j)=*(matrixa+i*n+j)+*(matrixb+i*n+j);
  }
  return 1;
}
/*求矩阵差,a,b为输入阵,out为差的矩阵,m,n为行和列*/
int absubV(double *matrixa,double *matrixb,double *out,int m,int n)
{
  int i,j;
  for(i=0;i<m;i++)
  {
   for(j=0;j<n;j++)
    *(out+i*n+j)=*(matrixa+i*n+j)-*(matrixb+i*n+j);
  }
  return 1;
}
#endif

arm平台和相关的矩阵运算库

一、arm平台ARM(Acorn RISC Machine,后改为Advanced RISC Machine)是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。类比于服务...
  • xmdxcsj
  • xmdxcsj
  • 2016年11月24日 21:07
  • 1602

C++矩阵运算库推荐

最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧。主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐。 Armadillo:C++下的Matlab替代品...
  • chenbang110
  • chenbang110
  • 2013年10月05日 10:16
  • 24306

异想家纯C语言矩阵运算库

Sandeepin最近做的项目中需要在嵌入式芯片里跑一些算法,而这些单片机性能不上不下,它能跑些简单的程序,但又还没到上Linux系统的地步。所以只好用C语言写一些在高级语言里一个函数就解决的算法了,...
  • sandeepin
  • sandeepin
  • 2016年11月30日 23:55
  • 2345

C语言矩阵运算库(Light Matrix)

最近在做卡尔曼滤波和最小二乘的一些算法,都需要运用到矩阵的运算,所以索性就写了个纯C的矩阵库(Light Matrix),只所以叫Light Matrix,因为目前只包含了矩阵的基本运算,尽量做到短小...
  • zoujiachi666
  • zoujiachi666
  • 2017年08月09日 04:14
  • 1394

C语言矩阵运算库大起底

C语言矩阵运算库
  • ZSZ_shsf
  • ZSZ_shsf
  • 2016年11月30日 17:11
  • 4378

Java中矩阵运算(math3的使用)

math3简介 math3中的矩阵操作 演示结果本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流。 未经本人允许禁止转载。下面是...
  • qy20115549
  • qy20115549
  • 2017年01月18日 20:12
  • 5533

[WebGL入门]十,矩阵计算和外部库

从长远来看,真正进行非常复杂的处理时,矩阵的知识还是不能缺少的。但是,要提前把这些都理解是很苦难的。所以,先熟练使用外部库,等能够熟练进行3D开发之后,再逐步了解这些知识是比较理想的。 使用外部库的时...
  • lufy_Legend
  • lufy_Legend
  • 2014年08月04日 22:28
  • 8236

C#矩阵类运算

///   /// 矩阵类  ///  ///  public sealed class Matrix  {      int row, column;            //矩...
  • qinxiaoli1204
  • qinxiaoli1204
  • 2013年03月11日 20:07
  • 1445

Spark上矩阵运算库(四)基本API搭建完毕

重写MLlib矩阵相关API 上周工作时所用到的矩阵相关API,均是extends MLlib中相关分布式矩阵API,但是很快便遇到了问题,由于我需要重写原先IndexedRow的toString方...
  • u014252240
  • u014252240
  • 2014年08月03日 01:32
  • 2961

CUDA编程基本概念与矩阵运算

1、并行计算1)单核指令级并行ILP---让单个处理器的执行单元可以同时执行多条指令2)多核并行TLP---在一个芯片上集成多个处理器核心,实现线程级并行3)多处理器并行---在一块电路板上安装多个处...
  • Augusdi
  • Augusdi
  • 2013年09月30日 20:42
  • 5241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:矩阵运算库
举报原因:
原因补充:

(最多只允许输入30个字)