| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 12426 人关注过本帖
标题:矩阵求逆的算法怎么写
只看楼主 加入收藏
wish_rain
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2008-4-4
收藏
 问题点数:0 回复次数:11 
矩阵求逆的算法怎么写
矩阵求逆的算法怎么写
搜索更多相关主题的帖子: 算法 矩阵 
2008-05-27 20:50
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
收藏
得分:0 
算法啊,那就是看你数学怎么做的就怎么做,不知道你是要求矩阵的转置还是求逆矩阵?求逆矩阵难度相当大,如果是转置的话就交换一下元素就可以了

在虚拟的世界中寻找目标。
2008-05-27 21:13
Loli
Rank: 1
来 自:飞燕算法群46520219
等 级:新手上路
帖 子:348
专家分:0
注 册:2008-5-27
收藏
得分:0 
计算逆矩阵的算法复杂度非常高

[color=white]
2008-05-27 21:16
wish_rain
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2008-4-4
收藏
得分:0 
线性代数学得很差
程序里面用到矩阵求逆
不会写

走在他人背后,看到的就只是一个背影,
走在他人前面,才能占尽先机
2008-05-27 21:17
语虫
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2008-5-18
收藏
得分:0 
先做出来,然后再想复杂度问题!
2008-05-27 23:50
Loli
Rank: 1
来 自:飞燕算法群46520219
等 级:新手上路
帖 子:348
专家分:0
注 册:2008-5-27
收藏
得分:0 
我喜欢把算法复杂度和代码结构什么的都想清楚了才动手

[color=white]
2008-05-28 00:06
xiaosan669
Rank: 1
来 自:西北工业大学
等 级:新手上路
帖 子:78
专家分:0
注 册:2007-3-9
收藏
得分:0 
//***************************
//求任何一个矩阵的逆矩阵
//***************************
#include <stdio.h>
#include <malloc.h>

void main( void )
{
     float *buffer,*p;   //定义数组首地址指针变量
     short int row,num; //定义矩阵行数row及矩阵元素个数
     short int i,j;
     float determ;      //定义矩阵的行列式

     float comput_D(float *p,short int n);      //求矩阵的行列式
     float Creat_M(float *p, short int m,short int n,short int k); //求代数余子式
     void Print( float *p,short int n);     //打印n×n的矩阵

     printf("\nPlease input the number of rows: ");
     scanf("%d",&row);
   
     num=2 * row * row;
     buffer = (float *)calloc(num, sizeof(float));     //分配内存单元

     p=buffer;
     if(p != NULL)
     {
         for(i=0;i<row;i++)                   //输入各单元值
         {
             printf("Input the number of %d row ",i+1);
             for(j=0;j<row;j++)
             {
                 scanf("%f",p++);
             }
         }  
     }
     else
         printf( "Can't allocate memory\n" );

     printf("\nThe original matrix is:\n");
     Print(buffer,row);     //打印该矩阵

     determ=comput_D(buffer,row);     //求整个矩阵的行列式
     p=buffer + row * row;
     if (determ != 0)
     {
         for (i=0;i<row; i++)       //求逆矩阵
             for (j=0; j<row; j++)
                    *(p+j*row+i)=   Creat_M(buffer,i,j,row)/determ;   
            
         printf("The determinant is %G\n",determ);

         p=buffer + row * row;
         printf("\nThe inverse matrix is:\n");
         Print(p,row);     //打印该矩阵
     }
     else
         printf("The determnant is 0, and there is no inverse matrix !\n");
     free( buffer );
}
//--------------------------------------------------------
//功能:求矩阵 n X n 的行列式
//入口参数:矩阵首地址 p;矩阵行数 n
//返回值:矩阵的行列式值
//--------------------------------------------------------
float comput_D(float *p,short int n)  
{
     short int i,j,m;         //i--row; j--column
     short int lop=0;
     float result=0;
     float mid=1;
   
     if (n!=1)
     {
         lop=(n==2)?1:n;     //控制求和循环次数,若为2阶,则循环1次,否则为n次

         for(m=0;m<lop;m++)
         {
             mid=1;          //顺序求和
             for(i=0,j=m;i<n;i++,j++)
                 mid = mid * ( *(p+i*n+j%n) );
             result+=mid;
         }

         for(m=0;m<lop;m++)
         {                       
             mid=1;          //逆序相减
             for(i=0,j=n-1-m+n; i<n; i++,j--)
                 mid=mid * ( *(p+i*n+j%n));
             result-=mid;
         }
        }
     else result=*p;
     return(result);
}
//----------------------------------------------------
//功能:求k×k矩阵中元素A(mn)的代数余子式
//入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k
//返回值: k×k矩阵中元素A(mn)的代数余子式
//----------------------------------------------------
float Creat_M(float *p, short int m,short int n,short int k)
{
     short int len;
     short int i,j;
     float mid_result=0;
     short int quo=1;
     float *p_creat,*p_mid;

     len=(k-1)*(k-1);
     p_creat = (float *)calloc(len, sizeof(float));     //分配内存单元
     p_mid=p_creat;
     for(i=0;i<k;i++)
         for(j=0;j<k;j++)
         {
             if (i!=m && j!=n)
                 *p_mid++ =* (p+i*k+j);            
         }
     //     Print(p_creat,k-1);
     quo = (m + n) %2==0 ? 1:-1;
     mid_result = (float ) quo * comput_D(p_creat,k-1);
     free(p_creat);
     return(mid_result);
}
//-------------------------------------------
//功能:打印n×n的矩阵
//入口参数:n×n矩阵的首地址;该矩阵的行数 n
//返回值: 无
//-------------------------------------------
void Print( float *p,short int n)   
{
     int i,j;
     for (i=0;i<n;i++)
     {
         for (j=0; j<n;j++)
             printf("%10G ",*p++);
         printf("\n");
     }
     printf("--------------\n");
}

========== 我的世界,我说了算! ==========
2008-06-05 23:16
wjwwowowo
Rank: 1
等 级:新手上路
帖 子:28
专家分:2
注 册:2013-4-10
收藏
得分:0 
回复 7 楼 xiaosan669
您这个你逆矩阵的算法是错误的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2014-05-31 10:43
wjwwowowo
Rank: 1
等 级:新手上路
帖 子:28
专家分:2
注 册:2013-4-10
收藏
得分:0 
回复 7 楼 xiaosan669
输入一个简单的二维数组就可以验证!!!!!!!!!!!!!!!!!!
2014-05-31 10:43
zhuyi8120
Rank: 2
等 级:论坛游民
帖 子:34
专家分:12
注 册:2014-11-4
收藏
得分:0 
回复 7 楼 xiaosan669
矩阵求逆有那么简单就好了。要把某一式子的正负号搞定都算好了。
2014-11-04 19:19
快速回复:矩阵求逆的算法怎么写
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012758 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved