c語言程式設計求任意對稱正定矩陣的逆

時間 2021-08-30 09:46:49

1樓:

#ifndef __matrix_dot_h__

#define __matrix_dot_h__

template

void swap(t& a, t& b)

class cmatrix

//返回矩陣行數

int getcol()const //返回矩陣列數

int rowswap(int x, int y); //行交換,成功返回1,否則0

int colswap(int x, int y); //列交換

static void setzero(double z); //設定zero的值,所有cmatrix例項精度都將改變

const cmatrix transpose()const; //返回轉置矩陣

const cmatrix adjoint()const; //伴隨矩陣

const cmatrix residue(int row, int col)const;//求對應元素的餘子式

const cmatrix contrary()const;//逆矩陣

const cmatrix gauss_jordan(double* pdet = null)const;//逆矩陣(高斯-約旦法),pdet為行列式,

//此法精度較低,但效率較高

double residue_a(int row, int col)const;//求對應元素的代數餘子式

double determinant()const; //返回方陣的行列式

double det_recursion()const; //返回方陣的行列式(遞迴)

int iszero()const; //判斷元素是否全為0(零矩陣)

int isphalanx()const; //判斷是否為方陣

int isreverse()const; //判斷矩陣是否可逆

int isnonfunnyphalanx()const; //判斷是否非奇異方陣

double* operator(int i)const; //操作單個元素

cmatrix& operator=(const cmatrix& right);

cmatrix& operator=(const double* pright);

cmatrix& operator=(const double** ppright);

const cmatrix& operator+()const; //一元操作符

const cmatrix operator-()const; //一元操作符

const cmatrix operator+(const cmatrix& right)const;

const cmatrix operator-(const cmatrix& right)const;

const cmatrix operator*(const cmatrix& right)const;

const cmatrix operator*(const double& right)const;

const cmatrix operator/(const double& right)const;

cmatrix& operator+=(const cmatrix& right);

cmatrix& operator-=(const cmatrix& right);

cmatrix& operator*=(const cmatrix& right);

cmatrix& operator*=(const double& right);

cmatrix& operator/=(const double& right);

int operator==(const cmatrix& right)const;

int operator!=(const cmatrix& right)const;

private:

int m_irow; //行數

int m_icol; //列數

double** m_ppdata; //資料

}; #endif //__matrix_dot_h__

//matrix.cpp

// #include

#include

#include

#include

#include

#include "matrix.h"

double cmatrix::zero = 1e-10;

cmatrix::cmatrix(int row/*=3*/, int col/*=3*/)

//拷貝建構函式

cmatrix::cmatrix(const cmatrix& right) }

cmatrix::~cmatrix()

void cmatrix::free()

m_ppdata = null;

} }int cmatrix::resize(int row, int col)

//初始化

for(i = 0; i < m_irow; i++)

return 1;

} //zero

void cmatrix::setzero(double z)

//show

void cmatrix::show(const char* pre/*=null*/)const

for(i = 0; i < m_irow; i++)

strcat(buf, "\n");

} messagebox(null, buf, "提示資訊", mb_ok);

#else

if(pre != null)

puts(pre);

for(i = 0; i < m_irow; i++)

#endif //_windows

} ///////////////////////////////////////計算//////////////////////////////////////

//行交換

int cmatrix::rowswap(int x, int y)

return 1;

} //列交換

int cmatrix::colswap(int x, int y)

return 1;

} //轉置

const cmatrix cmatrix::transpose()const

return tr;

} //計算方陣的行列式(精度不高)

double cmatrix::determinant()const

if (m == m_irow)

else

for (n = j; n < m_irow; n++)

k *= (-1);

} for (s = m_irow-1; s>i; s--) }

for (i = 0; i < m_irow; i++)

f *= temp[i][i];

sn = k * f;

return sn;

} //行列式(遞迴,精度較高)

double cmatrix::det_recursion()const

else if(m_irow == 2)

else }

return ans;

} //計算方陣的餘子式

const cmatrix cmatrix::residue(int row, int col)const

re = pdata;

delete pdata;

pdata = null;

return re;

} //計算方陣的代數餘子式

double cmatrix::residue_a(int row, int col)const

//伴隨矩陣

const cmatrix cmatrix::adjoint()const

return ad;

} //逆矩陣

const cmatrix cmatrix::contrary()const

//高斯-約旦法求逆矩陣(全選主元), pdet為原方陣的行列式

const cmatrix cmatrix::gauss_jordan(double* pdet/*=null*/)const }

} //if(fmax < 0.00001)//元素全為0

// if((int)rhs[0][k] != k)

if((int)rhs[1][k] != k)

//計算行列值

fdet *= m[k][k];

//計算逆矩陣

//第二步

m[k][k] = 1.0f/m[k][k];

//第三步

for(j = 0; j < m_icol; j++)

//第四步

for(i = 0; i < m_irow; i++) }

} //第五步

for(i = 0; i < m_irow; i++) }

}//end for(k);

for(k = m_irow-1; k >= 0; k--)

if((int)rhs[0][k] != k) }

fdet *= flag;

if(pdet != null)

*pdet = fdet;

return m;

} ///////////////////////////////////////判斷//////////////////////////////////////

//零矩陣

int cmatrix::iszero()const

return 1;

} //方陣

int cmatrix::isphalanx()const

//非奇異方陣

int cmatrix::isnonfunnyphalanx()const

//可逆矩陣

int cmatrix::isreverse()const

//double* cmatrix::operator (int i)const

// =

cmatrix& cmatrix::operator =(const cmatrix& right)

for(int i = 0; i < m_irow; i++)

return *this;

} // =

cmatrix& cmatrix::operator =(const double* pright)

return *this;

} // =

cmatrix& cmatrix::operator =(const double** ppright)

return *this;

} // 一元操作符+

const cmatrix& cmatrix::operator +()const

// 一元操作符-

const cmatrix cmatrix::operator -()const

return temp;

} // +

const cmatrix cmatrix::operator +(const cmatrix& right)const }

return temp;

} // -

const cmatrix cmatrix::operator -(const cmatrix& right)const }

return m_temp;

} // *

const cmatrix cmatrix::operator *(const cmatrix& right)const }

return m_temp;

} // *

const cmatrix cmatrix::operator *(const double& right)const

return m_temp;

} // /

const cmatrix cmatrix::operator /(const double& right)const

return m_temp;

} // +=

cmatrix& cmatrix::operator +=(const cmatrix& right)

// -=

cmatrix& cmatrix::operator -=(const cmatrix& right)

// *=

cmatrix& cmatrix::operator *=(const cmatrix& right)

// *=

cmatrix& cmatrix::operator *=(const double& right)

// /=

cmatrix& cmatrix::operator /=(const double& right)

// ==

int cmatrix::operator ==(const cmatrix& right)const

for(int i = 0; i < m_irow; i++)

return 1;

} // !=

int cmatrix::operator !=(const cmatrix& right)const

c語言程式設計,c語言的程式設計

如果n大於1 就執行 return n fun n 1 前邊一個return 執行函式就返回了,於是後邊的return沒有執行。若果n小於等於1,這個函式就不會執行前邊的return而繼續向後執行,後邊的程式就是這個return 1 後邊一個return 和前邊一個return作用是一樣的,只是在 ...

C語言,求1 3 5n的程式設計,怎樣利用C語言程式設計求1 3 5 N 的值?

庚午子李 有技術含量的,遞迴求解 include int a int n void main 給你個完整點吧 include int main while n 2 0 for int sum 0,i 1 i n i 2 sum i printf sum d n sum return 0 扛菸頭的大槍...

c語言程式設計求輸入,c語言程式設計 求輸入一個0 99的整數,判斷其是否為同構數,要求寫了程式還要有中文解釋其核心語句的作

思路 同構數是會出現在它的平方的右邊的數。具體見 include int main return 0 執行結果 15 62576 include stdio.h int main int argc,char argv 執行結果 include stdio.h int main int n,i,j,a...