社区
C语言
帖子详情
在c或者c++里如何求一个矩阵的逆矩阵?
gchao3325
2003-12-04 04:53:03
数学上的手算方法是左边放原矩阵,右边放一个单位矩阵,然后对有这两个矩阵组成的新矩阵的行进行数乘和相加的初等运算(相信学过线性代数的人一定不会忘记),将左面的原矩阵变成单位矩阵,那么,右面的那个随原矩阵同时做相同运算的单位矩阵就变成了原矩阵的逆矩阵,这种算法对于维数少的还可以使用,但是随着维数的增多,运算量便以指数增长。想问一下,有没有人知道什么快捷的算法,使运算量降下来?
...全文
2168
10
打赏
收藏
在c或者c++里如何求一个矩阵的逆矩阵?
数学上的手算方法是左边放原矩阵,右边放一个单位矩阵,然后对有这两个矩阵组成的新矩阵的行进行数乘和相加的初等运算(相信学过线性代数的人一定不会忘记),将左面的原矩阵变成单位矩阵,那么,右面的那个随原矩阵同时做相同运算的单位矩阵就变成了原矩阵的逆矩阵,这种算法对于维数少的还可以使用,但是随着维数的增多,运算量便以指数增长。想问一下,有没有人知道什么快捷的算法,使运算量降下来?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gchao3325
2003-12-11
打赏
举报
回复
zhouqingyuan(浪帆)说的另一种方法是什么?
laiben
2003-12-06
打赏
举报
回复
/*---------------------快速转置矩阵-------------------*/
#include <stdio.h>
#include <stdlib.h>
#define H 6 /* 行 */
#define L 7 /* 列 */
#define MAXSIZE 1250 /*非零个数的最大值*/
int M[H][L]={
{0,12,9,0,0,0,0},
{0,0,0,0,0,0,0},
{-3,0,0,0,0,14,0},
{0,0,24,0,0,0,0},
{0,18,0,0,0,0,0},
{15,0,0,-7,0,0,0}};
struct Triple
{
int i,j;
int e;
};
struct TSMatrix
{
struct Triple data[MAXSIZE+1];
int mu,nu,tu;
}; /* 稀疏矩阵的三元组顺序表存储表示 */
void createTSMatrix(struct TSMatrix *pt) /* 稀疏矩阵转为三元组存储 */
{ int wid,col,n=1;
for(wid=0;wid<H;wid++)
for(col=0;col<L;col++)
if(M[wid][col]&&n<=MAXSIZE) {
pt->data[n].i=wid+1;
pt->data[n].j=col+1;
pt->data[n].e=M[wid][col];
n++;
}
pt->mu=H;
pt->nu=L;
pt->tu=--n;
}
int FastTransposeSmatrix(struct TSMatrix *M,struct TSMatrix *T)
{ int col,t,p,q;
int num[MAXSIZE],cpot[MAXSIZE];
T->mu=M->mu;
T->nu=M->nu;
T->tu=M->tu;
if(T->tu) {
for(col=1;col<=M->nu;col++) num[col]=0;
for(t=1;t<=M->tu;t++) ++num[M->data[t].j];
cpot[1]=1;
for(col=2;col<=M->nu;col++) cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=M->tu;p++) {
col=M->data[p].j;
q=cpot[col];
T->data[q].i=M->data[p].j;
T->data[q].j=M->data[p].i;
T->data[q].e=M->data[p].e;
++cpot[col];
}
return 1; /* OK! */
}
return 0; /* NULL */
}
void main()
{ int n;
struct TSMatrix *a=(struct TSMatrix *)malloc(sizeof(struct TSMatrix));
struct TSMatrix *b=(struct TSMatrix *)malloc(sizeof(struct TSMatrix));
createTSMatrix(a);
if(FastTransposeSmatrix(a,b)) {
printf("\na is :\n"); /* PRINT MATRIX */
printf(" i j v\n");
printf(" ---------\n");
if(a->tu)
for(n=1;n<=a->tu;n++)
printf("%4d%4d%4d\n",a->data[n].i,a->data[n].j,a->data[n].e);
printf("\na's transposematrix b is :\n"); /* PRINT MATRIX A */
printf(" i j v\n");
printf(" ---------\n");
if(b->tu)
for(n=1;n<=b->tu;n++)
printf("%4d%4d%4d\n",b->data[n].i,b->data[n].j,b->data[n].e);
}
else printf("There's no element in the matrix!");
}
laiben
2003-12-06
打赏
举报
回复
/*---------------------经典转置矩阵-------------------*/
#include <stdio.h>
#include <stdlib.h>
#define H 6 /* 行 */
#define L 7 /* 列 */
#define MAXSIZE 1250 /*非零个数的最大值*/
int M[H][L]={
{0,12,9,0,0,0,0},
{0,0,0,0,0,0,0},
{-3,0,0,0,0,14,0},
{0,0,24,0,0,0,0},
{0,18,0,0,0,0,0},
{15,0,0,-7,0,0,0}};
struct Triple
{
int i,j;
int e;
};
struct TSMatrix
{
struct Triple data[MAXSIZE+1];
int mu,nu,tu;
}; /* 稀疏矩阵的三元组顺序表存储表示 */
void createTSMatrix(struct TSMatrix *pt) /* 稀疏矩阵转为三元组存储 */
{ int wid,col,n=1;
for(wid=0;wid<H;wid++)
for(col=0;col<L;col++)
if(M[wid][col]&&n<=MAXSIZE) {
pt->data[n].i=wid+1;
pt->data[n].j=col+1;
pt->data[n].e=M[wid][col];
n++;
}
pt->mu=H;
pt->nu=L;
pt->tu=--n;
}
int transposeSMatrix(struct TSMatrix *M,struct TSMatrix *T) /* transpose M to T */
{ int p,q,col;
T->mu=M->mu;
T->nu=M->nu;
T->tu=M->tu;
if(T->tu) {
q=1;
for(col=1;col<=M->nu;col++)
for(p=1;p<=M->tu;p++)
if(M->data[p].j==col) {
T->data[q].i=M->data[p].j;
T->data[q].j=M->data[p].i;
T->data[q].e=M->data[p].e;
q++;
}
return 1; /* ok! */
}
else return 0; /* NULL */
}
void main()
{ int n;
struct TSMatrix *a=(struct TSMatrix *)malloc(sizeof(struct TSMatrix));
struct TSMatrix *b=(struct TSMatrix *)malloc(sizeof(struct TSMatrix));
createTSMatrix(a);
if(transposeSMatrix(a,b)) {
printf("\na is :\n"); /* PRINT MATRIX A */
printf(" i j v\n");
printf(" ---------\n");
if(a->tu)
for(n=1;n<=a->tu;n++)
printf("%4d%4d%4d\n",a->data[n].i,a->data[n].j,a->data[n].e);
printf("\na's transposematrix b is :\n"); /* PRINT MATRIX A */
printf(" i j v\n");
printf(" ---------\n");
if(b->tu)
for(n=1;n<=b->tu;n++)
printf("%4d%4d%4d\n",b->data[n].i,b->data[n].j,b->data[n].e);
}
else printf("There's no element in the matrix!");
}
cai114
2003-12-05
打赏
举报
回复
我也想找一个简单的方法
帮你UP
gchao3325
2003-12-05
打赏
举报
回复
我学线性代数求逆矩阵就学了初等变换和通过伴随矩阵除以行列式两种方法,楼上的能告诉我你的代码是用了什么算法,或者说理论依据是什么?
zhouqingyuan
2003-12-05
打赏
举报
回复
求逆矩阵数学上面有两种方法的,你说了一种,另外一种你可以用程序实现的,虽然有点麻烦,但一次使用后,可以多次使用的。
galaxy_fxstar
2003-12-05
打赏
举报
回复
hehe,游侠兄弟有意思!
我感觉用伴随距阵的方法应该会快一点!
gchao3325
2003-12-05
打赏
举报
回复
crcr(游侠)同志,你说的是求转制,不是逆
数据结构与算法学习、智能算法
2003-12-05
打赏
举报
回复
是这样的,设一个变量就可以了
大致思想是这样的,
void reverseMarix(int aa[M][N],int i,int j)
{
for(i=0;i<M;i++)
for(j=0;j<i;j++)
{
int tt=a[i][j];
aa[i][j]=aa[j][i];
a[j][i]=tt;
}
}
wjyhl
2003-12-04
打赏
举报
回复
矩阵的逆运算你可以参考很多的书,但是前提条件必须知道逆是什么意思,然后你才可以看懂程序,下面是个例子
说明:aryin是输入的矩阵,numrow行numcol列输出
void MatTxTix(double *aryin,int numrow,int numcol,double *aryout)
{
int i, j, k;
for(i=0;i<=numcol-1;++i)
for(j=0;j<=numcol-1;++j)
{
aryout[i*numcol+j]=0.0;
for(k=0;k<=numrow-1;++k)
aryout[i*numcol+j]=aryout[i*numcol+j]+aryin[k*numcol+j]*aryin[k*numcol+i];
}
}
求
逆
矩阵
(
C++
)
使用
C++
实现两种
求
逆
矩阵
的方法
线性代数代码实现(五)
求
矩阵
的逆(
C++
)
前言: 在最近发布的两篇文章中,我们讲了两种判断
矩阵
是否可逆的方法,我们提到了
矩阵
的逆,那么很自然的就能想到,如何
求
解
矩阵
的逆,这篇文章中将会给出答案! 一、线性代数知识回顾: 1. 如果
矩阵
可逆,那么
矩阵
的逆是唯一的 这个简单的定理我们给出证明:(一些证明起来比较麻烦的定理我们一般不给出证明) 若 n 阶
矩阵
可逆,记的
一个
逆为,另
一个
逆为,则: 由此可见,的逆唯一,因此我们可以记为 2. n 阶
矩阵
可逆的充要条件是 可表示成一系列初等矩...
(Gauss-Jordan)高斯消元法
求
逆
矩阵
(含C/
C++
实现代码)
文章目录一、问题引出二、 一、问题引出 给定
一个
n×nn \times nn×n 的
矩阵
AAA ,我们想
求
得
一个
矩阵
BBB 使得 ∣A×B∣|A \times B|∣A×B∣ 即 AAA
矩阵
和 BBB
矩阵
的积
矩阵
的行列式为 111 ,那么这个 BBB
矩阵
就是 AAA
矩阵
的
逆
矩阵
,或者说 A×BA \times BA×B 得到单位
矩阵
EEE 二、 ...
C++
写
矩阵
求
逆
systemvue是一款专用的雷达,通信仿真软件,其底层的封装的模块库是用
c++
写的。 听博士哥哥说该软件目前处于推广阶段,由于目前模块库匮乏,所以比较蛋疼,就在这蛋疼的时候,我导师接到了这块烫手的山芋,然后更蛋疼的是,把这个写库的任务分给了我。。。。于是乎我又重拾
C++
大法,被迫暂停大数据比赛(我的穿衣搭配啊),全力转到写库上面来。最近接到博士哥哥的
一个
任务,让我写
一个
矩阵
求
逆的模块,
矩阵
求
逆(
c++
)
矩阵
求
逆(
c++
)标签(空格分隔): 技术博客简要过程介绍方法的名称是“Gauss-Jordan (or reduced row) elimination method”。设单位对角
矩阵
为I,则MM−1=IMM^{-1}=I主要过程为,摆
一个
相同大小的对角
矩阵
在旁边,将原
矩阵
变成对角
矩阵
的过程中,对对角
矩阵
施以相同的变化。原理为,对
矩阵
施以特定变化等同于对
矩阵
进行线性计算。实现过程第一步:准备阶段:
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章