数学引擎头文件中定义向量、矩阵(C++)

作者&投稿:连薇 (若有异议请与网页底部的电邮联系)
要在C++中定义一个很大的矩阵,如何定义~

有以下几种方法在C++中定义大矩阵:
数组定义
直接使用数组进行定义,这种情况一般会使用静态地址,数组访问下标也比较方便。但是在数量上不能太大。因为这类数组一般会分配到系统的栈空间,而对Windows来说,这个空间大约是2M左右(也有的资料说是1M),总之大小是一常量。
定义和使用数组的方法如下:
int a[500][200];//定义一个二维数组int k=a[3][5];//将一个数组元素赋值给k 2.申请指针空间
通过指针申请一个较大的空间,再使用算法计算元素所在的位置。
由于申请的空间在堆上,而堆的空间容量要远大于栈空间。所以它在容量上会更大,但是在使用时,需要使用代码计算元素的地址,复杂度稍有提高。
定义和使用方法如下:
int * a=new int[1000*2000];//定义指针a,且向系统申请1000*2000个数据元素需要的空间int k=*(a+20);//将a[20]赋值给k

#includeusing namespace std;class Vector{public: Vector() {} Vector(int l, int **t) :length(l) { v = new int[length]; *t = v; cout > v[i]; } }private: int length; int *v;};class Matrix :protected Vector{public: Matrix(int l, int w) { m = new int *[w]; int i; for (i = 0; i > l; cout > w; cout << "This is m1 :
"; Matrix m1(l, w); cout << "This is m2 :
"; Matrix m2(l, w); cout << "The result of m1 - m2 is as follows :
"; showmatrixminus(m1.getm(), m2.getm(),l,w); return 0;}

// Matrix.h: interface for matrix calculation functions.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_)
#define AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

////求矩阵matrix的行列式值,n为维数
float CalculateLiner(float *matrix,int n);

////求矩阵matrix的第i行,j列的代数余子式,n为维数
float CalculateCofacter(float *matrix,int i,int j,int n);

////matrixAT=(matrixA)T,m,n为matrixA的行、列数
void CalculateAT(float *matrixA,float *matrixAT,int m,int n);

////matrixAB=matrixA*matrixB,i,j为matrixA的行、列数,j,k为为matrixB的行、列数
void CalculateAB(float *matrixA,float *matrixB,float *matrixAB,int i,int j,int k);

////matrixATA=(matrixA)T*matrixA,m,n分别为matrixA的行、列数
void CalculateATA(float *matrixA,float *matrixATA,int m,int n);

////matrixA_为matrixA的逆,m为matrixA的行、列数
void CalculateA_(float *matrixA,float *matrixA_,int m);

///*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n);

////求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n);
void MatInversion(float *a,int n);

////解矩阵方程matrixA*matrixX=matrixL,m,n分别为matrixA矩阵的行,列数
void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n);

#endif // !defined(AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_)

// Matrix.cpp: implementation of the matrix calculation functions.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Matrix.h"
#include "math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

////求矩阵matrix的行列式值,n为维数
float CalculateLiner(float *matrix,int n)
{
float liner=0;
int i=0,j=0,k=0;
int p=0,q=0;

if(n==1)
return matrix[0];
else
{
float *tr=(float *)calloc((n-1)*(n-1),sizeof(float));
for(k=0;k<n;k++)
{
p=0;
for(i=0;i<n;i++)
{
if(i!=0)
{
q=0;
for(j=0;j<n;j++)
{
if(j!=k)
{
tr[p*(n-1)+q]=matrix[i*n+j];
q++;
}
}
p++;
}
}
liner+=matrix[k]*pow(-1,k)*CalculateLiner(tr,n-1);
}
free(tr);
return liner;
}
}

////求矩阵matrix的第i行,j列的代数余子式,n为维数
float CalculateCofacter(float *matrix,int i,int j,int n)
{
int x=0,y=0;
int p=0,q=0;

if(n==1)
return matrix[0];
else
{
float *tr=(float *)calloc((n-1)*(n-1),sizeof(float));
p=0;
for(x=0;x<n;x++)
{
if(x!=i)
{
q=0;
for(y=0;y<n;y++)
{
if(y!=j)
{
tr[p*(n-1)+q]=matrix[x*n+y];
q++;
}
}
p++;
}
}
float cc=pow(-1,i+j)*CalculateLiner(tr,n-1);
free(tr);
return cc;
}

}

////matrixAT=(matrixA)T,m,n为matrixA的行、列数
void CalculateAT(float *matrixA,float *matrixAT,int m,int n)
{
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
matrixAT[j*m+i]=matrixA[i*n+j];
}
}
}

////matrixAB=matrixA*matrixB,i,j为matrixA的行、列数,j,k为为matrixB的行、列数
void CalculateAB(float *matrixA,float *matrixB,float *matrixAB,int i,int j,int k)
{
for (int m=0;m<i;m++)
{
for (int n=0;n<k;n++)
{
matrixAB[m*k+n]=0;
for (int s=0;s<j;s++)
{
matrixAB[m*k+n]+=matrixA[m*j+s]*matrixB[s*k+n];
}
}
}
}

////matrixATA=(matrixA)T*matrixA,m,n为分别为matrixA的行、列数
void CalculateATA(float *matrixA,float *matrixATA,int m,int n)
{
float *at=(float *)calloc((m)*(n),sizeof(float));
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixA,matrixATA,n,m,n);
free(at);
}

////matrixA_为matrixA的逆,m为matrixA的行、列数
void CalculateA_(float *matrixA,float *matrixA_,int m)
{
float liner=CalculateLiner(matrixA,m);

for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
matrixA_[j*m+i]=CalculateCofacter(matrixA,i,j,m)/liner;
}
}
////////////////////////////////////////////////////////////////////
////求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n)
{
int i, j, k, m;
float w, g, *b;

b = new float [n];

for(k = 0; k <= n - 1; k++)
{
w = a[0];

w=a[0]+1.0e-15;
/*
if(fabs(w)+1.0 == 1.0)
{
delete b;
printf("fail\n");
return(-2);
}
*/
m = n - k - 1;

for(i = 1; i <= n - 1; i++)
{
g = a[i * n];
b[i] = g / w;

if(i <= m)
b[i] = -b[i];

for(j = 1; j <= i; j++)
a[(i - 1) * n + j - 1] = a[i * n + j] + g * b[j];
}
a[n * n - 1] = 1.0 / w;

for(i = 1; i <= n - 1; i++)
a[(n - 1) * n + i - 1] = b[i];
}

for(i = 0; i <= n - 2; i++)
for(j = i + 1; j <= n - 1; j++)
a[i * n + j] = a[j * n + i];
delete b;
return(2);
}

////求正定矩阵a的逆矩,n为阶数
void MatInversion(float *a,int n)
{
int i,j,k;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
if(i!=k) *(a+i*n+k) = -*(a+i*n+k)/(*(a+k*n+k));
}
*(a+k*n+k)=1/(*(a+k*n+k));
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k) *(a+i*n+j) += *(a+k*n+j)* *(a+i*n+k);
}
}
}
for(j=0;j<n;j++)
{
if(j!=k) *(a+k*n+j)*=*(a+k*n+k);
}
}
}

/*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n)
{
int *is,*js;
int i,j,k,l,u,v;
float temp,max_v;
is=(int *)malloc(n*sizeof(int));
js=(int *)malloc(n*sizeof(int));
if(is==NULL||js==NULL)
{
printf("out of memory!\n");
return(0);
}
for(k=0;k<n;k++)
{
max_v=0.0;
for(i=k;i<n;i++)
{
for(j=k;j<n;j++)
{
temp=fabs(m1[i*n+j]);
if(temp>max_v)
{
max_v=temp; is[k]=i; js[k]=j;
}
}
}
if(max_v==0.0)
{
free(is); free(js);
printf("invers is not availble!\n");
return(0);
}
if(is[k]!=k)
{
for(j=0;j<n;j++)
{
u=k*n+j; v=is[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
if(js[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+js[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
l=k*n+k;
m1[l]=1.0/m1[l];
for(j=0;j<n;j++)
{
if(j!=k)
{
u=k*n+j;
m1[u]*=m1[l];
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k)
{
u=i*n+j;
m1[u]-=m1[i*n+k]*m1[k*n+j];
}
}
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
u=i*n+k;
m1[u]*=-m1[l];
}
}
}
for(k=n-1;k>=0;k--)
{
if(js[k]!=k)
for(j=0;j<n;j++)
{
u=k*n+j; v=js[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
if(is[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+is[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
free(is); free(js);
return(1);
}

void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n)
{
if (m<n) return;
float *at=(float *)malloc((m)*(n)*sizeof(float));
float *ata=(float *)malloc((n)*(n)*sizeof(float));
float *atl=(float *)malloc((n)*sizeof(float));

CalculateATA(matrixA,ata,m,n);
MatrixInversion(ata,n);
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixL,atl,n,m,1);
CalculateAB(ata,atl,matrixX,n,n,1);

free(at);
free(ata);
free(atl);
}

求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n)
{
int i, j, k, m;
float w, g, *b;

b = new float [n];

for(k = 0; k <= n - 1; k++)
{
w = a[0];

w=a[0]+1.0e-15;
/*
if(fabs(w)+1.0 == 1.0)
{
delete b;
printf("fail\n");
return(-2);
}
*/
m = n - k - 1;

for(i = 1; i <= n - 1; i++)
{
g = a[i * n];
b[i] = g / w;

if(i <= m)
b[i] = -b[i];

for(j = 1; j <= i; j++)
a[(i - 1) * n + j - 1] = a[i * n + j] + g * b[j];
}
a[n * n - 1] = 1.0 / w;

for(i = 1; i <= n - 1; i++)
a[(n - 1) * n + i - 1] = b[i];
}

for(i = 0; i <= n - 2; i++)
for(j = i + 1; j <= n - 1; j++)
a[i * n + j] = a[j * n + i];
delete b;
return(2);
}

////求正定矩阵a的逆矩,n为阶数
void MatInversion(float *a,int n)
{
int i,j,k;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
if(i!=k) *(a+i*n+k) = -*(a+i*n+k)/(*(a+k*n+k));
}
*(a+k*n+k)=1/(*(a+k*n+k));
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k) *(a+i*n+j) += *(a+k*n+j)* *(a+i*n+k);
}
}
}
for(j=0;j<n;j++)
{
if(j!=k) *(a+k*n+j)*=*(a+k*n+k);
}
}
}

/*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n)
{
int *is,*js;
int i,j,k,l,u,v;
float temp,max_v;
is=(int *)malloc(n*sizeof(int));
js=(int *)malloc(n*sizeof(int));
if(is==NULL||js==NULL)
{
printf("out of memory!\n");
return(0);
}
for(k=0;k<n;k++)
{
max_v=0.0;
for(i=k;i<n;i++)
{
for(j=k;j<n;j++)
{
temp=fabs(m1[i*n+j]);
if(temp>max_v)
{
max_v=temp; is[k]=i; js[k]=j;
}
}
}
if(max_v==0.0)
{
free(is); free(js);
printf("invers is not availble!\n");
return(0);
}
if(is[k]!=k)
{
for(j=0;j<n;j++)
{
u=k*n+j; v=is[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
if(js[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+js[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
l=k*n+k;
m1[l]=1.0/m1[l];
for(j=0;j<n;j++)
{
if(j!=k)
{
u=k*n+j;
m1[u]*=m1[l];
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k)
{
u=i*n+j;
m1[u]-=m1[i*n+k]*m1[k*n+j];
}
}
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
u=i*n+k;
m1[u]*=-m1[l];
}
}
}
for(k=n-1;k>=0;k--)
{
if(js[k]!=k)
for(j=0;j<n;j++)
{
u=k*n+j; v=js[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
if(is[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+is[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
free(is); free(js);
return(1);
}

void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n)
{
if (m<n) return;
float *at=(float *)malloc((m)*(n)*sizeof(float));
float *ata=(float *)malloc((n)*(n)*sizeof(float));
float *atl=(float *)malloc((n)*sizeof(float));

CalculateATA(matrixA,ata,m,n);
MatrixInversion(ata,n);
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixL,atl,n,m,1);
CalculateAB(ata,atl,matrixX,n,n,1);

free(at);
free(ata);
free(atl);
}

定义一个长度为n的int型向量
int *Vec = new char[n]; //即开辟一个长度为n的int型数组
定义一个n*m维的int型矩阵
int *Matrix = new char[n][m]; //即定义一个n行m列的二维数组
之后就可以使用对数组的操作方法对其进行操作了。
使用完毕之后,记得要使用delete Vec和delete Matrix来释放指针。不然就会造成内存泄露

哈哈,我告诉你一个最简单的办法,#include"d3d9.h",#include "d3d9math.h"把库文件也添加进去。你要要处理什么向量、矩阵、逆、转置、投影、射线、子交并补一应俱全。微软都给你写好了,你还要自己费劲么?


C-Free 5.0中HGE引擎怎么可以用起来
我的是在C-free 4.0中配置的,你参考下。选择“构建”--“路径”--“[hge存放位置] hge\\hge181\\include”。如下面的图片:然后确定。这样构建路径就建立起来,可以引用hge的头文件了。建议编译器再选择 Bcc 编译器。然后新建工程,保存时添加到hge文件中,具体的方法可以看看上面的网址,在“...

Java软件工程师的发展路径
(2) Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。 (3) Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto语句处理出错的功能。 (4) Java不支持头文件,而C和C++语言中都用头文件来定义类的原型,全局变量,库函数等,这种采用头文件的结构使得系统的...

如何在VC++中安装Irrlicht引擎
Options->选择Directories表单,你会发现有一些Include目录,把irrlicht引擎的include目录也包含进去,然后选择LIB表单,把引擎的lib目录包含进去 如果你用vs.net的Tools -> Options,按同样方法加入Include(头文件)、和lib(库文件),注意在编译的时候把irrlicht.dll加入工程的根目录,并把所有所需的文件...

C语言和C++的区别
C语言与C++的区别有很多,下面是简要概述:1、面向不同 C语言是面向过程的,C++是面向对象的。函数库 C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;C++对于大多数的函数都是有集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的...

求一个c++实现人机对战,人人对战的五子棋游戏源代码,急用,谢谢_百度知 ...
StdAfx.hStdAfx.cpp 这对文件由用于将一些预编译信息纳入程序。编译后将产生stdafx.obj define.h 这是一个包含程序中的数据表示的定义的头文件。NewGame.hNewGame.cpp 这一对文件定义并实现用于新游戏的设置的对话框。renjuDlg.hrenjuDlg.cpp 这一对文件定义并实现了,五子棋的主界面。Eveluation.h...

收索引擎如何实现的?
当然打击传统的弱点并不能让我放弃传统,我们需要拿出可以比传统制作方式更快,更精确,更易于管理的方法。而今天我就是来表述我的观点!当我在开始学习标准之初我就在想着如何让我的工作量更加的少!减少没有必要的重复劳动,是美德。我发现我们制作网页在网页代码中我们有很多都是一样的!比如是头文...

...的时候程序就全屏,怎么办。我是在VS2005环境下使用OGRE引擎...
在启动界面里把程序调到窗口化就行了。 如果你没有这个界面,看看exampleApplication这个头文件是怎么设置这些启动项的就应该可以解决了

如何在cocos2d c++代码中调用lua以及探究
Cocos2dx 对lua的封装是很好的!如果不熟悉c++与lua的绑定的代码下面的不建议看 C++与lua的绑定传送门 关于cocos2d 与 lua绑定的代码的探究 \/\/打开"CCLuaEngine.h"单例实现CCScripEngineProtocol 后期应该支持不仅仅只是lua的脚本引擎 头文件有很多方法 挑一个看看 virtualintexecuteNodeEvent(CCNode*pNode,...

C加加与C语言有什么区别吗?我是计算机学院的,大一,只发了C加加书,但...
建议你学习C++的时候,学会用面向对象的方式思考和编程。现在在开发大项目的时候,都是应用面向对象的分析和设计的技术。C语言与C++的区别有很多:1,全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;而...

预处理是什么意思
这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。采用...

获嘉县18574991461: C语言如何从文件中读入矩阵和向量并实现向量乘矩阵 -
娄之氟罗: 首先你得明白这个二进制的文件里面的内容是怎样排列的要不然怎么读...你可以先产生一个简单的桁架矩阵,再试试用winHEX读取这个二进制文件看看哪个对应哪个.然后明白了他数据是怎么存的以后再设计算法去读取.

获嘉县18574991461: C++头文件中函数声明定义 -
娄之氟罗: 定义只能有一次,而声明的次数不限.任何标识符在使用前至少要有声明,将声明放在头文件中,就可以在需要使用到标识符时随时把头文件包含进来即可.如果把定义放进头文件中,那每包含一次头文件,标识符就定义了一次,这样在多文件的编译连接时很容易出问题的.包含其实就相当于把被包含文件的内容加入到其中,和用被包含文件中的内容替换掉对应的包含语句没有区别.使用头文件的好处就是免除了重复劳动的麻烦.反正最终编译器都是把被包含文件的内容合并到一块才编译的.所以这样,LZ觉得运行时的调用跟调用任何一个函数有区别吗.

获嘉县18574991461: C语言各个头文件的含义.... -
娄之氟罗: C/C++头文件-------------------------------------------------------------------------------- C、传统 C++#i nclude <assert.h> //设定插入点 #i nclude <ctype.h> //字符处理 #i nclude <errno.h> //定义错误码 #i nclude <float.h> //浮点数处理 #i nclude <fstream.h> //文件输...

获嘉县18574991461: C语言 编一个头文件,将经常使用的数学函数、字符处理函数及圆周率等符号常量事先定义好.以便以后调用. -
娄之氟罗: math.h已经定义了很多的数学函数,直接include<math.h>后,就可以用很多的数学函数了.自己也可以定义一个文件mymath.h和mymath.c,将一些自己需要的常量定义成宏,例如圆周率.定义和实现一些自己需要的而math.h中没有的函数.以后只要include "mymath.h"就可以用自己定义的常量和函数了.

获嘉县18574991461: c语言中 #include <math.h>是什么意思 -
娄之氟罗: #include<math.h> 意思是包含math库,实际上就是一个头文件,里面是一些已经写好的代码,形式上是一个个的函数,包含进来以后就可以使用里面的各种数学函数,如幂函数、三角函数、指数函数等. 扩展资料: 头文件是扩展名为 .h 的文...

获嘉县18574991461: C语言头文件的函数都定义在哪里 -
娄之氟罗: 正常的函数是不可以在头文件中定义的,除非你将函数定义成内联函数.在定义函数的时候,前面加上inline 就可以了.如: inline int a() { } 但是内联函数是C++里面的,可能C的编译器会不支持.如果你的编译器不支持,你可以使用宏来代替内联函数,宏是可以定义在头文件中的.

获嘉县18574991461: C语言头文件函数声明的格式问题,matrix.h文件内容如下,报错,请大家帮忙找找我的格式哪里不对..谢谢! -
娄之氟罗: typedef那行后面应该有引号,而且Array放在后面 typedef后使用类型名Array不需要struct然后是声明函数的时候是不能加花括号的,否则就是函数定义了 应该是: Array add(Array arr1,Array arr); 这样

获嘉县18574991461: C语言头文件 -
娄之氟罗: 传统 C++ #include//设定插入点 #include//字符处理 #include//定义错误码 #include//浮点数处理 #include//文件输入/输出 #include//参数化输入/输出 #include//数据流输入/输出 #include//定义各种数据类型最值常量 #include//定义本地化函...

获嘉县18574991461: 关于C51单片机头文件内定义I0端口定义的问题 -
娄之氟罗: 会的.可以这样解决:#ifndef config_H#define config_H sbit KEY_IN_1 = P2^4; //矩阵按键的扫描输入引脚1 sbit KEY_IN_2 = P2^5; //矩阵按键的扫描输入引脚2#endif

获嘉县18574991461: 请教头文件中的定义问题
娄之氟罗: 问题解决了,是因为在主函数文件里好含头文件的顺序出里问题.应先包含IQmath.h,再包含PARK的头文件.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网