⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 本目录主要包括:文档和两个源代 其中源代码是识别程序的
💻 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 + -