C++矩陣運算的實現(xiàn)簡單
利用C++實現(xiàn)矩陣的構造,通過運算符的重載實現(xiàn)矩陣的乘法、加法等。并且實現(xiàn)矩陣形狀的打印,矩陣的打印。
#include<iostream>
#include<memory>
#include<assert.h>
#include<stdlib.h>
using namespace std;
class Matrix{
public:
Matrix(int row, int col); //構造函數(shù)
Matrix(int row, int col, int num);//構造函數(shù)重載
~Matrix(); //析構函數(shù)
Matrix(const Matrix & other); //賦值函數(shù)
Matrix operator*(const Matrix& other); //矩陣相乘
Matrix operator+(const Matrix& other); //矩陣相加
Matrix operator-(const Matrix& other); //矩陣相減
int **a = nullptr; //初始化一共空指針
int row, col;
void shape(); //打印矩陣形狀
void Ma_pri(); //打印矩陣
};
int main(){
Matrix a(2,1); //構造一個(2,1)矩陣
Matrix b(1,2); //構造一個(1,2)矩陣
a.a[0][0] = 4; //初始化矩陣
a.a[1][0] = 2;
b.a[0][0] = 3;
b.a[0][1] = 5;
a.shape(); //矩陣形狀打印
b.shape();
Matrix c = a*b; //矩陣相乘
c.shape();
c.Ma_pri(); //矩陣打印
Matrix d(3,3,1);
d.Ma_pri();
system("pause");
return 0;
}
Matrix::Matrix(int row, int col){
this->row = row;
this->col = col;
this->a = new int*[row];
for(int i=0;i<this->row;i++){
a[i] = new int[this->col];
}
}
Matrix::Matrix(int row, int col, int num){
this->row = row;
this->col = col;
this->a = new int*[row];
for(int i=0;i<this->row;i++){
a[i] = new int[this->col];
}
for(int i = 0; i < this->row; i++){
for(int j =0; j <this->row; j++){
this->a[i][j] = num;
}
}
}
Matrix::~Matrix(){
for(int i=0;i<this->row;i++){
if(a[i] != nullptr){
delete[] a[i];
a[i] = nullptr;
}
}
if(a != nullptr){
delete[] a;
a = nullptr;
}
}
Matrix::Matrix(const Matrix& other){
row = other.row;
col = other.col;
a = new int*[row];
for(int i=0;i<row;i++){
a[i] = new int[col];
memcpy(a[i], other.a[i],sizeof(int)*col);
}
}
Matrix Matrix::operator*(const Matrix& other){
if(this->col != other.row){
cout<<"shape error"<<endl;
exit(0);
}
Matrix m(this->row,other.col);
for(int i=0; i<this->row; i++){
for(int j=0;j<other.col;j++){
int sum = 0;
for(int k=0;k<this->col;k++){
sum += this->a[i][k] * other.a[k][j];
}
m.a[i][j] = sum;
}
}
return m;
}
Matrix Matrix::operator+(const Matrix& other){
if(this->col != other.col or this->row != other.row){
cout<<"shape error"<<endl;
exit(0);
}
Matrix m(this->row,this->col);
for(int i = 0;i < this->row; i++){
for(int j = 0; j < this-> col; j++){
m.a[i][j] = this->a[i][j] + other.a[i][j];
}
}
return m;
}
Matrix Matrix::operator-(const Matrix& other){
if(this->col != other.col or this->row != other.row){
cout<<"shape error"<<endl;
exit(0);
}
Matrix m(this->row,this->col);
for(int i = 0;i < this->row; i++){
for(int j = 0; j < this-> col; j++){
m.a[i][j] = this->a[i][j] - other.a[i][j];
}
}
return m;
}
void Matrix::shape(){
cout<<"("<<this->row<<","<<this->col<<")"<<endl;
}
void Matrix::Ma_pri(){
for(int i = 0; i < this->row; i++){
for(int j =0; j <this->row; j++){
cout<<this->a[i][j]<<" ";
}
cout<<endl;
}
}
矩陣求逆算法及程序實現(xiàn)
在做課題時,遇到了求多項式問題,利用了求逆方法。矩陣求逆一般使用簡單的算法,還有快速算法 如全選主元高斯-約旦消元法,但本文程序主要寫了簡單的矩陣求逆算法定義法之伴隨矩陣求逆公式如下,其中A可逆:A^{-1}=\frac{A^*}{|A|},其中A^*是A的伴隨矩陣。。
1.給定一個方陣,非奇異(不是也可,程序有考慮);
2.由矩陣得到其行列式,求其值如|A|;
3.求其伴隨矩陣A^*;
4.得到其逆矩陣。
主要函數(shù)如下:
//得到給定矩陣src的逆矩陣保存到des中。
bool GetMatrixInverse(double src[N][N],int n,double des[N][N])
{
double flag=getA(src,n);
double t[N][N];
if(flag==0)
{
return false;
}
else
{
getAStart(src,n,t);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
des[i][j]=t[i][j]/flag;
}
}
}
return true;
}
計算|A|:
//按第一行展開計算|A|
double getA(double arcs[N][N],int n)
{
if(n==1)
{
return arcs[0][0];
}
double ans = 0;
double temp[N][N]={0.0};
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
for(k=0;k<n-1;k++)
{
temp[j][k] = arcs[j+1][(k>=i)?k+1:k];
}
}
double t = getA(temp,n-1);
if(i%2==0)
{
ans += arcs[0][i]*t;
}
else
{
ans -= arcs[0][i]*t;
}
}
return ans;
}
計算伴隨矩陣:
//計算每一行每一列的每個元素所對應的余子式,組成A*
void getAStart(double arcs[N][N],int n,double ans[N][N])
{
if(n==1)
{
ans[0][0] = 1;
return;
}
int i,j,k,t;
double temp[N][N];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n-1;k++)
{
for(t=0;t<n-1;t++)
{
temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t];
}
}
ans[j][i] = getA(temp,n-1);
if((i+j)%2 == 1)
{
ans[j][i] = - ans[j][i];
}
}
}
}
到此這篇關于C++矩陣運算的實現(xiàn)簡單的文章就介紹到這了,更多相關C++ 矩陣運算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++用read()和write()讀寫二進制文件的超詳細教程
二進制的文件肉眼我們是讀不懂的,如果通過二進制的讀寫操作就可以讀懂,下面這篇文章主要給大家介紹了關于C++用read()和write()讀寫二進制文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06

