小弟急需一些矩阵运算的源程序,不知那位大哥知道?

gmlan1978 2003-04-02 02:02:31
主要是为了解决A*X=B的问题,其中A为n阶方阵,B为n维列向量。
留下地址或者发到邮箱,不甚感谢!!
gmlan@mail.china.com
...全文
108 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttapi 2003-05-12
  • 打赏
  • 举报
回复
这个东东有现成的。我记得上次在 ibm 的 linux works 上面看过。你找找看吧
meteor135 2003-05-10
  • 打赏
  • 举报
回复
给你一个支持两个矩阵相乘的完全实现。
只要第二个矩阵退化成向量,你的问题就解决了。

#include<stdio.h>
#include<conio.h>

void cheng(int **m1,int **m2, int **result, int h1,int l1,int l2)
{
int i,j,k;
for(i=0;i<h1;i++)
{
for(j=0;j<l2;j++)
{
result[i][j]=0;
for(k=0;k<l1;k++)
result[i][j]+=m1[i][k]*m2[k][j];
}
}
}

void allocate(int** &m,int h, int l)
{
m = new int*[h];
for(int i = 0 ;i < h; i ++)
m[i] = new int[l];
}

void init(int** &m, int h, int l)
{
int i, j;
allocate(m,h,l);
for(i = 0; i < h; i ++)
for(j = 0; j < l; j ++)
m[i][j] = 0;
}

void input(int** &m, int h, int l)
{
int i, j;
init(m,h,l);
printf("你将要进行矩阵初始化操作\n");
for(i = 0; i < h; i ++)
{
printf("请输入第%d行元素,共%d个\n",i+1,l);
for(j = 0; j < l; j ++)
{
printf("请输入该行第%d个元素\n",j+1);
flushall();
scanf("%d",&m[i][j]);
if(l-j-1)
printf("还剩%d个\n",l-j-1);
}
printf("\n");
}
}

void output(int **m, int h, int l)
{
int i,j;
for(i = 0; i < h; i++)
{
for(j = 0; j < l; j ++)
printf("%3d ",m[i][j]);
printf("\n");
}
printf("\n");
}

void main()
{
int h1 = 1;
int l1 = 1;
int &h2 = l1;
int l2 = 1;

int **m1 = NULL;
int **m2 = NULL;
int **result = NULL;

printf("你将要进行矩阵相乘操作\n");
printf("第一个矩阵参数:\n");
printf("行数:");
scanf("%d",&h1);
printf("列数:");
scanf("%d",&l1);

printf("第二个矩阵参数:\n");
printf("列数:");
scanf("%d",&l2);


init(result,h1,l2);

input(m1,h1,l1);
printf("这是你刚才输入的第一个矩阵:\n");
output(m1,h1,l1);
printf("按任意键继续...\n");
getch();

input(m2,h2,l2);
printf("这是你刚才输入的第二个矩阵:\n");
output(m2,h2,l2);

cheng(m1,m2, result, h1,l1,l2);

printf("这是上面两个矩阵相乘的结果矩阵:\n");
output(result,h1,l2);
printf("按任意键退出...");
getch();

int i;
for(i = 0; i < h1; i ++)
{
delete m1[i];
delete result[i];
}
for(i = 0; i < h2; i ++)
delete m2[i];
delete m1;
delete m2;
delete result;
}

fixopen 2003-04-21
  • 打赏
  • 举报
回复
MTL C++ Matrix Template Library。不用重复发明轮子了吧,而且,还是有bug的轮子:)
熊主任 2003-04-06
  • 打赏
  • 举报
回复
呵呵,阿虎的代码和我写的差不多,用一维数组模拟二维数组挺有意思:)
但是你为什么参数不用传引用呢?可以更快一点。
还有你destructor好像忘写了吧?
blas 2003-04-06
  • 打赏
  • 举报
回复
lapack(fortran) -- www.netlib.org/
The Matrix Template Library (MTL) -- www.osl.iu.edu/research/mtl/
scilab -- www-rocq.inria.fr/scilab/
zhouhu 2003-04-06
  • 打赏
  • 举报
回复
matrix类包含私有数据: rows、cols(矩阵元素的行列位置),elems(存放
矩阵的所有元素的一维整数指针)以及如下公有成员函数:
matrix():默认构造函数。
matrix(short r,short c):构造函数。
int operator () (short row,short col):重载运算符成员函数。
void setelem(short row,short col,int val):将元素(row,col)设置为val。
friend matrix operator +(matrix p,matrix q):重载运算符友元函数。
friend matrix operator -(matrix p,matrix q):重载运算符友元函数。
friend matrix operator *(matrix p,matrix q):重载运算符友元函数。
void disp():显示矩阵所有元素。

#include <iostream.h>
#include <iomanip.h>
class matrix
{
short rows,cols;
int *elems;
public:
matrix() {}
matrix(short r,short c)
{
rows=r;cols=c;
elems=new int[rows*cols];
}
int operator () (short row,short col);
void setelem(short row,short col,int val);
friend matrix operator +(matrix p,matrix q);
friend matrix operator -(matrix p,matrix q);
friend matrix operator *(matrix p,matrix q);
void disp();
};
int matrix::operator()(short row,short col)
{
if (row>=1 && row<=rows && col>=1 && col<=cols)
return elems[(row-1)*cols+(col-1)];
else
return 0;
}
void matrix::setelem(short row,short col,int val)
{
if (row>=1 && row<=rows && col>=1 && col<=cols)
elems[(row-1)*cols+(col-1)]=val;
}
matrix operator +(matrix p,matrix q)
{

matrix m(p.rows,p.cols);
if (p.rows!=q.rows || p.cols!=q.cols)
return m;
for (int r=1;r<=p.rows;r++)
for (int c=1;c<=p.cols;++c)
m.setelem(r,c,p(r,c)+q(r,c));
return m;
}
matrix operator -(matrix p,matrix q)
{
matrix m(p.rows,p.cols);
if (p.rows!=q.rows || p.cols!=q.cols)
return m;
for (int r=1;r<=p.rows;r++)
for (int c=1;c<=p.cols;c++)
m.setelem(r,c,p(r,c)-q(r,c));
return m;
}
matrix operator *(matrix p,matrix q)
{
matrix m(p.rows,q.cols);
if (p.cols!=q.rows)
return m;
for (int r=1;r<=p.rows;r++)
for (int c=1;c<=q.cols;c++)
{
int s=0;
for (int i=1;i<=p.cols;i++)
s+=p(r,i)*q(i,c);
m.setelem(r,c,s);
}
return m;
}
void matrix::disp()
{
for (int r=1;r<=rows;++r)
{

cout << " ";
for (int c=1;c<=cols;c++)
cout << setw(2) << (*this)(r,c) << " ";
cout << endl;
}
}
void main()
{
matrix a(2,3),b(2,3),c(3,2),d(2,3),e(2,2);
a.setelem(1,1,1);
a.setelem(1,2,2);
a.setelem(1,3,3);
a.setelem(2,1,4);
a.setelem(2,2,5);
a.setelem(2,3,6);
b.setelem(1,1,1);
b.setelem(1,2,2);
b.setelem(1,3,3);
b.setelem(2,1,4);
b.setelem(2,2,5);
b.setelem(2,3,6);
c.setelem(1,1,1);
c.setelem(1,2,4);
c.setelem(2,1,2);
c.setelem(2,2,5);
c.setelem(3,1,3);
c.setelem(3,2,6);
cout << "输出结果" << endl;
cout << " A矩阵:" << endl;
a.disp();
cout << " B矩阵:" << endl;
b.disp();
cout << " C矩阵:" << endl;
c.disp();
d=a+b;
cout << " A+B矩阵:" << endl;
d.disp();
d=a-b;
cout << " A-B矩阵:" << endl;
d.disp();
e=a*c;
cout << " A*C矩阵:" << endl;
e.disp();
}
gumbour 2003-04-05
  • 打赏
  • 举报
回复
科学计算常用c程序集
中国科技出版社
qing_li73 2003-04-04
  • 打赏
  • 举报
回复
See the samples below, FYI:

http://www.codeproject.com/cpp/ymatrix.asp
http://www.codeproject.com/cpp/matrixcontainer.asp
cmsbai 2003-04-04
  • 打赏
  • 举报
回复
我写了一个矩阵类,有你想要的部分,想要的话我发给你,email:cmsbai@msn.com
brucegong 2003-04-03
  • 打赏
  • 举报
回复





徐士良的一本书,好像叫<C语言常用算法程序集>







sandrowjw 2003-04-02
  • 打赏
  • 举报
回复
http://www.osl.iu.edu/research/mtl/
今天早上刚在CSDN上查到的,以后问以前你可以先搜索一下相关主题。
zhaosetup 2003-04-02
  • 打赏
  • 举报
回复
你为什么不用matlab呢,它是一个不错的数学软件
处理象你这样的问题是很简单的。直接输入A、B
然后X=A\B就可以了

65,208

社区成员

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

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