请问C++ 中如何作矩阵运算和解矩阵方程?

lhslktg 2009-11-05 03:36:48
请问C++ 中如何作矩阵运算和解矩阵方程?

比如 AX=B 求解 X。 分为 X 有惟一解的情形 和 求X 有很多解的时候地表达式。 以及 无解的情形。

如何 作 矩阵 A 的转置 和 对矩阵A 求逆矩阵 等对矩阵A 求一系列的运算。

不知道上面的解方程 和矩阵运算 C++中有没有直接可以用的 库文件 包括进来进行求解的?

应该不同的库文件, 采取的解方程得算法也不同。
希望能给出不同的库文件, 并说明各个库文件采用什么算法解的方程。(比如可以 直接解或者 迭代的方法来解。 他们各自又有许多不同的算法。)

希望给出代码说明。

用的 Visual studio 2008
谢谢
...全文
1372 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhslktg 2009-11-06
  • 打赏
  • 举报
回复
顶一个
大家知道有什么现成的 标准库文件做矩阵运算的吗?

谢谢
lhslktg 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]
二维数组和一维数组寻址级别是一样的,这里的参数都是一维的,楼主调用的时候注意分配空间时列数要两倍于行数——记得行列式变换求逆吧,把原矩阵和单位矩阵并排的。
[/Quote]

为啥 整数矩阵和浮点矩阵 在求逆的时候不同? 不都是 把原矩阵和单位矩阵并排的。 然后进行变换吗?
lhslktg 2009-11-05
  • 打赏
  • 举报
回复
不用,我是想看别人怎么写和解决这个问题的? 
这个是属于知道的话很快就可以写出来的问题。
没有你觉得那么难。
yshuise 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lhslktg 的回复:]
就先说下 要使用什么头文件?


AX=B 求解 X。  分为 X 有惟一解的情形  和 求X 有很多解的时候地表达式。 以及 无解的情形。

如何 作 矩阵 A 的转置 和 对矩阵A 求逆矩阵 等对矩阵A 求一系列的运算。

上面的解方程 和矩阵运算 如何写?

不要大段理论而没有实际code。 code是第一位的
[/Quote]
自己不会动手?你送我200分我就帮你这个事。
shuilongyin_00 2009-11-05
  • 打赏
  • 举报
回复


mark
lhslktg 2009-11-05
  • 打赏
  • 举报
回复
就先说下 要使用什么头文件?


AX=B 求解 X。 分为 X 有惟一解的情形 和 求X 有很多解的时候地表达式。 以及 无解的情形。

如何 作 矩阵 A 的转置 和 对矩阵A 求逆矩阵 等对矩阵A 求一系列的运算。

上面的解方程 和矩阵运算 如何写?

不要大段理论而没有实际code。 code是第一位的
yshuise 2009-11-05
  • 打赏
  • 举报
回复
Boost::uBLAs库
这个库的开发由一系列的类似的库来指导:

由Jack Dongarra等人开发的BLAS 库。
由Todd Veldhuizen开发的Blitz++ 库。
由Scott Haney 等人开发的POOMA 库。
由Jeremy Siek等人开发的MTL 库。

BLAS 似乎是基本的线性代数使用最广泛的库,所以它可以被称作de-facto standard。它的接口是面向过程的(procedural),单独的函数是对一些基本的线性代数运算的抽象。由于它是使用Fortran语言实现以及它所进行的优化,BLAS似乎也是现在最快的库之一。因为我无决定以面向对象的方式来设计和实现我们的类库,所以技术方式上有显著的不同。然而,每个人都可以使用我们的库中的运算符表达所有的BLAS抽象并对效率进行比较。

Blitz++ 是一个使用C++实现的让人映象深刻的(impressive)库。它的主要设计似乎是面向多维数组以及包括张量(tensor)的相关的运算符。Blitz++库的作者声称由于它的实现技术使用表达式模板(expression template)和模板元编程技术(template metaprogram),他的库的性能与对应的Fortan代码的性能相当或更好一些。然而我们有一些理由来开发一个我们自己设计和实现的方法。我们不知道是否有人使用Blitz++库来实现传统的线性代数运算。我们同样也假定由于Blitz++库所使用的实现风格(idioms),即使在今天也需要最高级的C++编译器技术。另一方面,Blitz++库也使用我们相信,使用表达式模板技术(expression templates)是将抽象惩罚降低到一个可接受限度的必需的技术方法。

POOMA 的设计目标似乎是在许多部分对Blitz++库的大量部分进行并行计算。它从偏微分方程和理论物理领域中提取类来扩展Blitz++的概念。这种实现支持并行体系结构(parallel architectures)。

MTL 是另一个使用C++来支持基本的线性代数运算的类库。我们共同的观点是线性代数库应当提供与BLAS库相应的功能。另一方面,我们认为C++标准库的概念并没有支持所需要的数值计算的概念要求。另一个区别是MTL库当前并没有使用表达式模板技术(expression templates)。这可能导致两个问题中的一个:可能存在表现能力缺失或可能的性能损失。
jackyjkchen 2009-11-05
  • 打赏
  • 举报
回复
有了

http://www.ibm.com/developerworks/cn/linux/other/matrix/
lhslktg 2009-11-05
  • 打赏
  • 举报
回复
谢谢楼上
还希望能看到更多的算法,最好是现成已经测试过的 库文件。 因为复杂情况的时候,避免再调试 和检查错误。

最想知道的是 conjugate gradient method 这个算法来解方程 那个头文件包含了,如何调用。
conjugate gradient method 属于 迭代的解法。


同时对于解矩阵方程 迭代的解法 还有 Jocobi (雅可比) 迭代解法。 好像还有高斯 什么迭代解法。

然后直接的解法的算法应该有:LU, QR,和 House Holder等算法。

希望大家能提供code 看下这些算法的实现

最好是告诉我哪个头文件能实现上面的算法,调用格式。
当然 是c++

谢谢
jackyjkchen 2009-11-05
  • 打赏
  • 举报
回复
二维数组和一维数组寻址级别是一样的,这里的参数都是一维的,楼主调用的时候注意分配空间时列数要两倍于行数——记得行列式变换求逆吧,把原矩阵和单位矩阵并排的。
jackyjkchen 2009-11-05
  • 打赏
  • 举报
回复
矩阵运算一般人家都用matlab,没听说著名的矩阵算法,我这里有个整数矩阵相乘、转置、求逆算法(采用行列式变换)。我写古典密码库的时候写的。

整数矩阵和浮点矩阵主要在求逆的时候不同,整数用的是行列式变换,浮点矩阵好像是全主元高斯消去法,有本书专门讲的。


int CheckReverse(int a)
{
int n = MODULUS;
int p = 2;
while(p*p<n)
{
if (a%p == n%p && 0 == a%p)
return 0;
p++;
}
return 1;
}

int GetReverse(int a)
{
int n = MODULUS;
int q, p, t;
int x = 0, y = 1, z;
q = n;
p = a;
z = (int)q / p;
while (1 != p && 1 != q)
{
t = p;
p = q % p;
q = t;
t = y;
y = x - y * z;
x = t;
z = (int)q / p;
}
y = y % n;
if (y < 0)
y += n;
return y;
}

void MatrixMulti(unsigned char *in1,int *in2,unsigned char *out,unsigned int matrixsize)
{
unsigned int k = 0,j = 0;
for(j=0; j<matrixsize; j++)
for(k=0; k<matrixsize; k++)
*(out + j) += (unsigned char)((*(in1 + k)) * (*(in2 + matrixsize*k + j)) & 255);
}

void MatrixTrans(int *key,unsigned int matrixsize)
{
unsigned int i = 0,j = 0;
int t = 0;
for(i=0; i<matrixsize; i++)
{
for(j=i+1; j<matrixsize/2; j++)
{
t = *(key + i*matrixsize + j);
*(key + i*matrixsize + j) = *(key + j*matrixsize + i);
*(key + j*matrixsize + i) = t;
}
}
}

int MatrixReverse(int *key,unsigned int matrixsize)
{
unsigned int i = 0,j = 0,k = 0,rev = 0;
for(i=0; i<matrixsize; i++)
{
for(j=matrixsize; j<matrixsize*2; j++)
{
if(j == i + matrixsize)
*(key + matrixsize*i*2 + j) = 1;
else
*(key + matrixsize*i*2 + j) = 0;
}
}
for (j = 0; j < matrixsize;++j)
{
for (i = j; i < matrixsize; ++i)
{
if (CheckReverse(*(key + matrixsize*i*2 + j)))
{
rev = GetReverse(*(key + matrixsize*i*2 + j));
for (k = 0; k < matrixsize * 2;++k)
{
int t = 0;
*(key + matrixsize*i*2 + k) *= rev;
*(key + matrixsize*i*2 + k) %= MODULUS;
t = *(key + matrixsize*i*2 + k);
*(key + matrixsize*i*2 + k) = *(key + matrixsize*j*2 + k);
*(key + matrixsize*j*2 + k) = t;
}
break;
}
if (matrixsize - 1 == i)
return 0;

}
for (i = 0; i < matrixsize ; ++i)
{
if (i != j)
{
int t = *(key + matrixsize*i*2 + j);
for (k = 0; k < matrixsize * 2; k++)
{
*(key + matrixsize*i*2 + k) -= t * *((int*)key + matrixsize*j*2 + k);
*(key + matrixsize*i*2 + k) %= MODULUS;
if (*(key + matrixsize*i*2 + k)<0)
*(key + matrixsize*i*2 + k) += MODULUS;
}
}
}
}
return 1;
}

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧