?? test.cpp
字號:
#include "tvec.h"
#include "tmat.h"
#include <crtdbg.h>
typedef tmat<double> CMatrix;
typedef tvec<double> CVector;
/****************************************************************************************
一個簡單易用的矩陣類庫
使用簡介:
初始化矩陣: tmax<double>A(3,2); -生成一個3行2列的零陣
初始化矩陣: tmax<double>B(2,2,a); -生成一個2行2列的矩陣并利用數組a的前2×2個元素為其賦值。
這里要求a至少要包含2×2個元素
給矩陣元素賦值: A(1,2)=1.0; -將1.0賦給矩陣A的第1行、第2列
取矩陣元素的值: f=A(2,2); -取出矩陣A第2行、第2列的值賦給f
矩陣的加、減、乘: A=B+C;C=B*A;等等,可以像普通數據類型那樣直接進行運算符運算
矩陣轉置: transpose(A);
求矩陣行列式: det(A); 注意:必須是方陣
矩陣求逆: inv(A); 注意:必須是方陣
得到矩陣的行數和列數: A.nrows(); A.ncols();
resize矩陣: A.resize(2,2); -取原來A矩陣的前2×2個元素來構造新尺寸的A
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
另外,tvec.h則包含了一個矢量(向量)類庫,這里也簡要介紹一下
初始化向量: tvec<double>A; -生成一個一維的向量。默認初始值為0
初始化向量: tvec<double>B(4); -生成一個4維的向量
初始化向量: tvec<double>C(4,0.1); -生成一個4維的向量,并將每一維元素初始化為0.1
初始化向量: tvec<double>D(5,a); -生成一個5維的向量,并用數組a的前5個元素為其賦值
初始化向量: tvec<double>E(B); -由向量B來初始化向量E。相當于復制向量
給向量的元素賦值: B(1)=2.0; -給B向量的第1維元素賦值為2.0
提取向量元素的值: f=B(2); -將B向量的第2維元素提取出來,賦給變量f
得到向量的維數: B.nsize();
******************************************************************************************
【注意】:
1.本類庫的矩陣、向量運算采用值傳遞
2.本類庫的矩陣和向量的第一個元素的起始下標為1,不是0。這點尤其要注意。這和C語言中的數組不一樣
*此注釋由zhao hui添加
bugzhao@sohu.com
*****************************************************************************************/
CVector V[3];
bool test()
{
V[0].resize (4);
V[0](1)=1;
double k=V[0](1);
cout<<k;
return true;
}
int main()
{
double a[]={1,2,3,4,5,6,7,8,9};
double b[]={1.12,2.45,5.67,-2.2,3.4,6.4,0,7.1};
//創建一個2行3列的零陣mA
CMatrix mA(2,3);
mA(1)=2;
mA(2)=4;
mA(3)=mA(2);
mA(4)=5;////mA(4)其實就是mA(2,1)
mA(2,3)=9;
cout<<"測試1:\n"<<mA;
cout<<"mA(4)="<<mA(4)<<"\n";
cout<<"mA(2,1)="<<mA(2,1)<<"\n";
//由mA來創建一個一模一樣的矩陣mB
CMatrix mB(mA);
cout<<"測試2:\n"<<mB;
cout<<"A的內存地址:"<<&mA;
cout<<"\nB的內存地址:"<<&mB<<"\n";
//resize矩陣mA。保留原來mA中的前2×2個元素
mA.resize(2,2);
cout<<"測試3:\n"<<mA;
cout<<"A的內存地址:"<<&mA<<"\n";//可見resize后,A的地址不變
//由數組a來創建一個矩陣mC
CMatrix mC(3,2,a);
cout<<"測試4:\n"<<mC;
//求mD轉置
CMatrix mD(2,3,a);
cout<<"測試5:\n"<<mD<<"\n轉置前mD的地址:"<<&mD<<"\n";
mD=transpose(mD);
cout<<mD<<"\n轉置后mD的地址:"<<&mD<<"\n";
//可見,雖然轉置后行數、列數互換,這里仍然可以直接把轉置后的矩陣賦給自身
//位于等號左邊的矩陣可以自動調整行數和列數。這很便利!
//求逆矩陣
CMatrix mE(2,2,b);
cout<<"測試6:\n"<<mE;
mE=inv(mE);
cout<<mE;
cout<<inv(mE);//再求逆回來。注意這句不會改變mE本身,但可以顯示出再次求逆后的結果
cout<<mE;
//矩陣的連續運算
CMatrix A(2,2,a);
CMatrix B(3,2,a);
CMatrix C(2,3,a);
CMatrix D;
D=inv(A)*transpose(B)+C;//求D=A的逆乘以B的轉置,再加上C
//可見,該類庫來進行矩陣的一系列運算非常簡單!
cout<<"測試7:\nA的逆乘以B的轉置,再加上C\n"<<A<<B<<C<<D;
cout<<A<<inv(A)<<A*inv(A);
cout<<diagprod(A)<<"\n";
///////////////////////////////
//以下進入向量部分
CVector vA(3,a);
cout<<"測試8:向量\n"<<vA;
//由向量構造矩陣
CMatrix mAA(3,1,vA);
cout<<"由向量構造矩陣\n"<<mAA;
//這里,將列向量vA(3行、1列)轉化為3行、1列的矩陣,于是就可以使用矩陣計算公式來兼容向量了!
//
//最后,調用diagbyarray函數來由一個數組來構造一個矩陣。這里矩陣對角線的元素為該數組的元素
CMatrix mBB;
double aa[]={1,2,3,4,5};
diagbyarray(mBB,aa,5);
cout<<"最后一個測試:\n"<<mBB;
diagbyarray(mBB,aa,3);
cout<<"\n"<<mBB;
/*
CVector v1,v2;
v1.resize (4);
v1(1)=2;
v2.resize (4);
cout<<v1;
cout<<v2;
double kkk=v1(1);
cout<<"kkk: "<<kkk<<"\n";
*/
test();
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -