最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言求逆矩陣案例詳解

 更新時間:2021年08月16日 09:09:38   作者:dogdng  
這篇文章主要介紹了C語言求逆矩陣案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一般求逆矩陣的方法有兩種,伴隨陣法和初等變換法。但是這兩種方法都不太適合編程。伴隨陣法的計算量大,初等變換法又難以編程實現(xiàn)。
適合編程的求逆矩陣的方法如下:

  1. 對可逆矩陣A進行QR分解:A=QR
  2. 求上三角矩陣R的逆矩陣
  3. 求出A的逆矩陣:A^(-1)=R^(-1)Q^(H)

以上三步都有具體的公式與之對應(yīng),適合編程實現(xiàn)。
C語言實現(xiàn)代碼:

#include <stdio.h>
#include <math.h>

#define SIZE  8

double b[SIZE][SIZE]={0};//應(yīng)該讀作“貝爾塔”,注釋中用B表示
double t[SIZE][SIZE]={0};//求和的那項
double Q[SIZE][SIZE]={0};//正交矩陣
double QH[SIZE][SIZE]={0};//正交矩陣的轉(zhuǎn)置共軛
double R[SIZE][SIZE]={0};//
double invR[SIZE][SIZE]={0};//R的逆矩陣
double invA[SIZE][SIZE]={0};//A的逆矩陣,最終的結(jié)果
//={0};//
double matrixR1[SIZE][SIZE]={0};
double matrixR2[SIZE][SIZE]={0};

//double init[3][3]={3,14,9,6,43,3,6,22,15};
double init[8][8]={  
    0.0938  ,  0.5201 ,   0.4424  ,  0.0196  ,  0.3912  ,  0.9493 ,   0.9899  ,  0.8256,
    0.5254  ,  0.3477 ,   0.6878  ,  0.3309 ,   0.7691  ,  0.3276 ,   0.5144  ,  0.7900,
    0.5303  ,  0.1500 ,   0.3592  ,  0.4243 ,   0.3968  ,  0.6713 ,   0.8843  ,  0.3185,
    0.8611  ,  0.5861 ,   0.7363  ,  0.2703 ,   0.8085  ,  0.4386 ,   0.5880  ,  0.5341,
    0.4849  ,  0.2621 ,   0.3947  ,  0.1971 ,   0.7551  ,  0.8335 ,   0.1548  ,  0.0900,
    0.3935  ,  0.0445 ,   0.6834  ,  0.8217 ,   0.3774  ,  0.7689 ,   0.1999  ,  0.1117,
    0.6714  ,  0.7549 ,   0.7040  ,  0.4299 ,   0.2160  ,  0.1673 ,   0.4070  ,  0.1363,
    0.7413  ,  0.2428 ,   0.4423  ,  0.8878 ,   0.7904  ,  0.8620 ,   0.7487  ,  0.6787
};
/*/
函數(shù)名:int main()
輸入:
輸出:
功能:求矩陣的逆 pure C language
     首先對矩陣進行QR分解之后求上三角矩陣R的逆陣最后A-1=QH*R-1,得到A的逆陣。
作者:HLdongdong
*//////////////////////////////////////////////////////////////////////
int main()
{
    int i;//數(shù)組  行
    int j;//數(shù)組  列
    int k;//代表B的角標(biāo)
    int l;//數(shù)組  列
    double dev;
    double numb;//計算的中間變量
    double numerator,denominator;
    double ratio;
    /////////////////求B/////////////////
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            b[j][i]=init[j][i];
        }
        for(k=0;k<i;++k)
        {
            if(i)
            {
                numerator=0.0;
                denominator=0.0;
                for(l=0;l<SIZE;++l)
                {
                    numerator+=init[l][i]*b[l][k];
                    denominator+=b[l][k]*b[l][k];
                }
                dev=numerator/denominator;
                t[k][i]=dev;
                for(j=0;j<SIZE;++j)
                {
                    b[j][i]-=t[k][i]*b[j][k];//t  init  =0  !!!
                }
            }
        }
    }
    ///////////////////對B單位化,得到正交矩陣Q矩陣////////////////////
    for(i=0;i<SIZE;++i)
    {
        numb=0.0;
        for(j=0;j<SIZE;++j)
        {
            numb+=(b[j][i]*b[j][i]);
        }
        dev=sqrt(numb);
        for(j=0;j<SIZE;++j)
        {
            Q[j][i]=b[j][i]/dev;
        }
        matrixR1[i][i]=dev;
    }
    /////////////////////求上三角R陣///////////////////////
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            if(j<i)
            {
                matrixR2[j][i]=t[j][i];
            }
            else if(j==i)   
            {
                matrixR2[j][i]=1;
            }
            else
            {
                matrixR2[j][i]=0;
            }
        }
    }
    mulMatrix(matrixR1,matrixR2,SIZE,SIZE,SIZE,R);
///////////////////////QR分解完畢//////////////////////////
    printf("QR分解:\n");
    printf("Q=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf("%2.4f    ",Q[i][j]);
        //  
        }
        printf("\n");
    }
    printf("R=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf("%2.4f    ",R[i][j]);
        //  
        }
        printf("\n");
    }
/////////////////////求R的逆陣//////////////////////////
    for(i=SIZE-1;i>=0;--i)
    {
        invR[i][i]=1/R[i][i];
        //R[i][i]=invR[i][i];
        if(i!=(SIZE-1))//向右
        {
            for(j=i+1;j<SIZE;++j)
            {
                invR[i][j]=invR[i][j]*invR[i][i];
                R[i][j]=R[i][j]*invR[i][i];
            }
        }
        if(i)//向上
        {
            for(j=i-1;j>=0;--j)
            {
                ratio=R[j][i];
                for(k=i;k<SIZE;++k)
                {
                    invR[j][k]-=ratio*invR[i][k];
                    R[j][k]-=ratio*R[i][k];
                }
            }   
        }
    }

///////////////////////////////////////////////////////

    printf("inv(R)=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf(" %2.4f  ",invR[i][j]);
        //  
        }
        printf("\n");
    }
////////////////////結(jié)果和MATLAB差一個負(fù)號,神馬鬼????????/////////////////////
/////////////////////求QH//////////////////////////
    for(i=0;i<SIZE;++i)//實矩陣就是轉(zhuǎn)置
    {
        for(j=0;j<SIZE;++j)
        {
            QH[i][j]=Q[j][i];
        }
    }
///////////////////////求A的逆陣invA/////////////////////////////

    mulMatrix(invR,QH,SIZE,SIZE,SIZE,invA);

    printf("inv(A)=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf(" %2.4f  ",invA[i][j]);
        //  
        }
        printf("\n");
    }

///////////////////////結(jié)果與MATLAB的結(jié)果在千分位后有出入,但是負(fù)號都是對的^v^///////////////////////////
    return 0;
}

另附上矩陣乘法的子函數(shù)

/*/
函數(shù)名:void mulMatrix(double matrix1[SIZE][SIZE],double matrix2[SIZE][SIZE],int high1,int weight,int weight2,double mulMatrixOut[SIZE][SIZE])
輸入:依次是 左矩陣,右矩陣,左矩陣高度,左矩陣寬度,右矩陣寬度,輸出矩陣
輸出:
功能:矩陣乘法
作者:HLdongdong
*//
void mulMatrix(double matrix1[SIZE][SIZE],double matrix2[SIZE][SIZE],int high1,int weight,int weight2,double mulMatrixOut[SIZE][SIZE])
{
    int i,j,k;
    for(i=0;i<high1;++i)
    {
        for(j=0;j<weight2;j++)
        {
            for(k=0;k<weight;++k)
            {
                mulMatrixOut[i][j]+=matrix1[i][k]*matrix2[k][j];
            }
        }
    }
}

到此這篇關(guān)于C語言求逆矩陣案例詳解的文章就介紹到這了,更多相關(guān)C語言求逆矩陣內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中注釋與注意事項的深入講解

    C語言中注釋與注意事項的深入講解

    在編寫C語言源代碼時,應(yīng)該多使用注釋,這樣有助于對代碼的理解,這篇文章主要給大家介紹了關(guān)于C語言中注釋與注意事項的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • VC++中圖像處理類CBitmap的用法

    VC++中圖像處理類CBitmap的用法

    使用VC進行圖像處理的時候,CBitmap類為我們提供了豐富的位圖處理函數(shù),本文總結(jié)了該類的相關(guān)函數(shù)和常用使用方法,包括加載位圖,顯示位圖,析構(gòu)CBitmap資源以及在內(nèi)存中保存位圖等內(nèi)容。
    2015-11-11
  • C++中的繼承模式深入詳解

    C++中的繼承模式深入詳解

    這篇文章主要介紹了C++中的繼承模式深入詳解。繼承是OOP設(shè)計中的重要概念。在C++語言中,派生類繼承基類有三種繼承方式:私有繼承(private)、保護繼承(protected)和公有繼承(public)。
    2021-03-03
  • C++中map和set的簡介及使用詳解

    C++中map和set的簡介及使用詳解

    本文主要介紹了C++中map和set的簡介及使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言編程動態(tài)內(nèi)存分配常見錯誤全面分析

    C語言編程動態(tài)內(nèi)存分配常見錯誤全面分析

    這篇文章主要介紹了C語言編程中動態(tài)內(nèi)存分配的常見錯誤全面分析講解,同樣遇到過C語言動態(tài)內(nèi)存分配各種問題的同學(xué)可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • C++ 輸入scanf()和輸出printf()的操作

    C++ 輸入scanf()和輸出printf()的操作

    這篇文章主要介紹了C++ 輸入scanf()和輸出printf()的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • opencv如何識別圖片上帶顏色的圓

    opencv如何識別圖片上帶顏色的圓

    這篇文章主要為大家詳細(xì)介紹了opencv如何識別圖片上帶顏色的圓,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 純C語言:分治快速排序源碼分享

    純C語言:分治快速排序源碼分享

    這篇文章主要介紹了分治快速排序源碼,有需要的朋友可以參考一下
    2014-01-01
  • C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復(fù)項之二)

    C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復(fù)項之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復(fù)項之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談C++反向迭代器的設(shè)計

    淺談C++反向迭代器的設(shè)計

    本文主要介紹了淺談C++反向迭代器的設(shè)計,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

元氏县| 隆昌县| 介休市| 望都县| 五峰| 镇坪县| 北流市| 铁力市| 茂名市| 崇文区| 黔西县| 历史| 黎川县| 建平县| 天等县| 固原市| 二连浩特市| 讷河市| 绥棱县| 虎林市| 泰和县| 民勤县| 平昌县| 鄂尔多斯市| 蒙自县| 汝州市| 新泰市| 稷山县| 临城县| 昌吉市| 沐川县| 荆州市| 牡丹江市| 商都县| 丁青县| 蒙山县| 乐平市| 磐石市| 兴义市| 广宗县| 铜山县|