亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? matrix.cpp

?? 用c++編寫數(shù)學(xué)常用算法的源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <fstream.h>
// 本程序?qū)崿F(xiàn)matrix類
// 對matrix類的定義
#include "matrix.h"

matrix::matrix(buffer * b): // 缺省構(gòu)造函數(shù),產(chǎn)生0行0列空矩陣
	rownum(0),colnum(0),istrans(0),isneg(0),issym(0)
{
		if(b){ // 如用戶給出b,則使用b作為數(shù)據(jù)緩存
			buf=b;
			buf->alloc(0);
			}
		else // 否則,產(chǎn)生一個新的緩存,類別是當(dāng)前缺省的緩存類
			buf = getnewbuffer(0);
}

matrix::matrix(size_t n, buffer * b): // 產(chǎn)生n階單位方陣
		rownum(n),colnum(1),istrans(0),isneg(0),issym(0)
{
		if(b){ // 如用戶給出b,則使用b作為數(shù)據(jù)緩存
			buf=b;
			buf->alloc(n);
			}
		else // 否則,產(chǎn)生一個新的緩存,類別是當(dāng)前缺省的緩存類
			buf = getnewbuffer(n);
}

matrix unit(size_t n)	// 產(chǎn)生n階單位矩陣
{
	if(n==0) throw TMESSAGE("n must larger than 0\n");
	matrix m(n,n);
	for(size_t i=0; i<n; i++)
	for(size_t j=0; j<n; j++)
		if(i==j) m.set(i,j,1.0);
		else m.set(i,j,0.0);
	m.issym = 1;
	return m;
}


matrix::matrix(size_t r, size_t c, buffer * b):
		rownum(r),colnum(c),istrans(0),isneg(0),issym(0)
{
		if(b){ // 如用戶給出b,則使用b作為數(shù)據(jù)緩存
			buf=b;
			buf->alloc(r*c);
			}
		else // 否則,產(chǎn)生一個新的緩存,類別是當(dāng)前缺省的緩存類
			buf = getnewbuffer(r*c);
}

matrix::matrix(matrix& m) // 拷貝構(gòu)造函數(shù)
{
	rownum = m.rownum;	// 拷貝行數(shù)與列數(shù)
	colnum = m.colnum;
	istrans = m.istrans;	// 拷貝轉(zhuǎn)置標(biāo)記
	isneg = m.isneg;		// 拷貝負(fù)值標(biāo)記
	issym = m.issym;		// 拷貝對稱標(biāo)記
	buf = m.buf;		// 設(shè)置指向相同緩存的指針
	buf->refnum++;	// 緩存的引用數(shù)增1
}

matrix::matrix(const char * filename, buffer * b): // 從數(shù)據(jù)文件構(gòu)造矩陣
	istrans(0), isneg(0), issym(0)
{
	char label[10];
	ifstream in(filename); // 打開文件流
	in >> label; // 文件開始必須有matrix關(guān)鍵詞
	if(strcmp(label, "matrix")!=0) throw TMESSAGE("format error!");
	in >> rownum >> colnum; // 讀取行數(shù)和列數(shù)
	if(!in.good()) throw TMESSAGE("read file error!");
	// 申請或產(chǎn)生緩存
	if(b) { buf=b;
		buf->alloc(rownum*colnum);
	}
	else buf = getnewbuffer(rownum*colnum);
	size_t line;
	for(size_t i=0; i<rownum; i++) { // 依次按行讀取
		in >> line; // 讀行號
		if(line != i+1) throw TMESSAGE("format error!");
		in.width(sizeof(label));
		in >> label; // 行號后跟冒號
		if(label[0] != ':') throw TMESSAGE("format error!");
		DOUBLE a;
		for(size_t j=0; j<colnum; j++) { // 讀取一行數(shù)據(jù)
			in >> a;
			set(i,j,a);
		}
		if(!in.good()) throw TMESSAGE("read file error!");
	}
	checksym(); // 檢查是否為對稱陣
}

matrix::matrix(void * data, size_t r, size_t c, buffer * b):
		rownum(r),colnum(c),istrans(0),isneg(0),issym(0) // 數(shù)據(jù)構(gòu)造函數(shù)
{
	if(b){
		buf=b;
		buf->alloc(r*c);
		}
	else
		buf = getnewbuffer(r*c);
	DOUBLE * d = (DOUBLE *)data;
	for(size_t i=0; i<r*c; i++)  // 這里進(jìn)行數(shù)據(jù)拷貝,因此原數(shù)據(jù)的內(nèi)存是可以釋放的
		buf->set(i,d[i]);
	checksym();	// 檢查是否為對稱陣
}

DOUBLE matrix::operator()(size_t r, size_t c)
{
	if(r>= rownum || c>= colnum)
		throw TMESSAGE("Out range!");
	return value(r,c);
}

matrix& matrix::operator=(matrix& m)  // 賦值重載
{
	rownum = m.rownum; //  行數(shù)和列數(shù)的拷貝
	colnum = m.colnum;
	istrans = m.istrans; // 轉(zhuǎn)置標(biāo)志的拷貝
	isneg = m.isneg;	// 取負(fù)標(biāo)志的拷貝
	issym = m.issym;	// 對稱標(biāo)志的拷貝
	if(buf == m.buf)  // 如果原緩存與m的緩存一樣,則返回
		return (*this);
	buf->refnum--; // 原緩存不同,則原緩存的引用數(shù)減1
	if(!buf->refnum)delete buf; // 減1后的原緩存如果引用數(shù)為0,則刪除原緩存
	buf = m.buf; // 將原緩存指針指向m的緩存
	buf->refnum++; // 新緩存的引用數(shù)增1
	checksym();	// 檢查是否為對稱陣
	return (*this); // 返回自己的引用
}

matrix& matrix::operator=(DOUBLE a) // 通過賦值運(yùn)算符將矩陣所有元素設(shè)為a
{
	if(rownum == 0 || colnum == 0) return (*this);
	for(size_t i=0; i<rownum; i++)
	for(size_t j=0; j<colnum; j++)
		set(i,j,a);
	if(rownum == colnum)issym = 1;
	return (*this);
}

matrix matrix::operator-() // 矩陣求負(fù),產(chǎn)生負(fù)矩陣
{
	matrix mm(*this);
	mm.neg();
	return mm;
}

ostream& operator<<(ostream& o, matrix& m) // 流輸出運(yùn)算符
{
	// 先輸出關(guān)鍵字matrix,然后是行號,制表符,列號,換行
	o << "matrix " << m.rownum << '\t' << m.colnum << endl;
	for(size_t i=0; i<m.rownum; i++) { // 依次輸出各行
		o<< (i+1) <<':'; // 行號后跟冒號。注意輸出的行號是從1開始
				// 是內(nèi)部編程的行號加1
		size_t k=8; // 后面輸入一行的內(nèi)容,每次一行數(shù)字超過八個時
			// 就換一行
		for(size_t j=0; j<m.colnum; j++) {
			o<<'\t'<<m.value(i,j);
			if(--k==0) {
				k=8;
				o<<endl;
			}
		}
		o<<endl; // 每行結(jié)束時也換行
	}
	return o;
}

istream& operator>>(istream& in, matrix& m) // 流輸入運(yùn)算符
{
	char label[10];
	in.width(sizeof(label));
	in >> label; // 輸入matrix關(guān)鍵字
	if(strcmp(label, "matrix")!=0)
		throw TMESSAGE("format error!\n");
	in >> m.rownum >> m.colnum; // 輸入行號和列號
	if(!in.good()) throw TMESSAGE("read file error!");
	m.buf->refnum--; // 原緩存引用數(shù)減1
	if(!m.buf->refnum) delete m.buf; // 如原緩存引用數(shù)為0,則刪去原緩存
	m.isneg = m.istrans = 0; // 轉(zhuǎn)置和取負(fù)標(biāo)志清零
	m.buf = getnewbuffer(m.rownum*m.colnum); // 按缺省子類產(chǎn)生新緩存
	size_t line; // 按矩陣行輸入
	for(size_t i=0; i<m.rownum; i++) {
		in >> line; // 先輸入行號
		if(line != i+1) throw TMESSAGE("format error!\n");
		in.width(sizeof(label)); // 行號后應(yīng)跟冒號
		in >> label;
		if(label[0] != ':') throw TMESSAGE("format error!\n");
		DOUBLE a; // 隨后是本行的各個數(shù)值
		for(size_t j=0; j<m.colnum; j++) {
			in >> a;
			m.set(i,j,a);
		}
		if(!in.good()) throw TMESSAGE("read file error!");
	}
	m.checksym();	// 檢查是否為對稱陣
	return in;
}

matrix& matrix::operator*=(DOUBLE a) // 矩陣數(shù)乘常數(shù)a,結(jié)果放在原矩陣
{
	for(size_t i=0; i<rownum; i++)
	for(size_t j=0; j<colnum; j++)
		set(i,j,a*value(i,j));
	return (*this);
}

matrix matrix::operator*(DOUBLE a) // 矩陣數(shù)乘常數(shù)a,原矩陣內(nèi)容不變,返回一新矩陣
{
	matrix m(rownum, colnum);
	for(size_t i=0; i<rownum; i++)
	for(size_t j=0; j<colnum; j++)
		m.set(i,j,a*value(i,j));
	return m;
}

matrix matrix::operator+(matrix& m) // 矩陣相加,產(chǎn)生一新的矩陣并返回它
{
	if(rownum != m.rownum || colnum != m.colnum) // 對應(yīng)行列必須相同
		throw TMESSAGE("can not do add of matrix\n");
	matrix mm(rownum, colnum); // 產(chǎn)生一同自己同形的矩陣
	DOUBLE a;
	for(size_t i=0; i<rownum; i++) // 求和
	for(size_t j=0; j<colnum; j++)
	{
		a = value(i,j)+m.value(i,j);
		mm.set(i,j,a);
	}
	mm.checksym();	// 檢查是否為對稱陣
	return mm;
}

matrix& matrix::operator+=(matrix &m) // 矩陣求和,自己內(nèi)容改變?yōu)楹?{
	DOUBLE a;
	for(size_t i=0; i<rownum; i++)
	for(size_t j=0; j<colnum; j++)
	{
		a = value(i,j)+m.value(i,j);
		set(i,j,a);
	}
	checksym();	// 檢查是否為對稱陣
	return (*this);
}

matrix matrix::operator+(DOUBLE a)	// 矩陣加常數(shù),指每一元素加一固定的常數(shù),產(chǎn)生
											// 新矩陣,原矩陣不變
{
	matrix m(rownum, colnum);
	for(size_t i=0; i<rownum; i++)
	for(size_t j=0; j<colnum; j++)
		m.set(i,j,a+value(i,j));
	return m;
}

matrix& matrix::operator+=(DOUBLE a)	// 矩陣自身加常數(shù),自身內(nèi)容改變
{
	for(size_t i=0; i<rownum; i++)
	for(size_t j=0; j<colnum; j++)
		set(i,j,a+value(i,j));
	return (*this);
}

matrix operator-(DOUBLE a, matrix& m) { // 常數(shù)減矩陣,產(chǎn)生新的矩陣
	return (-m)+a;
};


matrix matrix::operator-(matrix& m) // 矩陣相減,產(chǎn)生新的矩陣
{
	matrix mm(*this); // 產(chǎn)生一同自己同形的矩陣
	mm += (-m);	// 加上相應(yīng)的負(fù)矩陣
	return mm;
}

matrix& matrix::operator-=(matrix& m) // 矩陣相減,結(jié)果修改原矩陣
{
	(*this) += (-m);
	return (*this);
}

matrix matrix::operator*(matrix& m) // 矩陣相乘,原矩陣內(nèi)容不變,產(chǎn)生一新矩陣
{
	if(colnum != m.rownum) // 必須滿足相乘條件
		throw TMESSAGE("can not multiply!");
	matrix mm(rownum,m.colnum); // 計算并產(chǎn)生一合要求的矩陣放乘積
	DOUBLE a;
	for(size_t i=0; i<rownum; i++) // 計算乘積
	for(size_t j=0; j<m.colnum; j++){
		a = 0.0;
		for(size_t k=0; k<colnum; k++)
			a += value(i,k)*m.value(k,j);
		mm.set(i,j,a);
	}
	mm.checksym();	// 檢查是否為對稱陣
	return mm; // 返回乘積
}

matrix& matrix::operator*=(matrix& m) // 矩陣相乘,自己修改成積矩陣
{
	(*this) = (*this)*m;
	return (*this);
}

matrix matrix::t()  // 矩陣轉(zhuǎn)置,產(chǎn)生新的矩陣
{
	matrix mm(*this);
	mm.trans();
	return mm;
}

int matrix::isnear(matrix& m, double e) // 檢查二矩陣是否近似相等
{
	if(rownum != m.rownum || colnum != m.colnum) return 0;
	for(size_t i=0; i< rownum; i++)
	for(size_t j=0; j< colnum; j++)
		if(fabs(value(i,j)-m.value(i,j)) > e) return 0;
	return 1;
}

int matrix::isnearunit(double e) // 檢查矩陣是否近似為單位矩陣
{
	if(rownum != colnum) return 0;
	return isnear(unit(rownum), e);
}

matrix matrix::row(size_t r) // 提取第r行行向量
{
	matrix mm(1, colnum);
	for(int i=0; i< colnum; i++)
		mm.set(0, i, value(r,i));
	return mm;
}

matrix matrix::col(size_t c) // 提取第c列列向量
{
	matrix mm(rownum, 1);
	for(int i=0; i< rownum; i++)
		mm.set(i, value(i, c));
	return mm;
}

void matrix::swapr(size_t r1, size_t r2, size_t k) // 交換矩陣r1和r2兩行
{
	DOUBLE a;
	for(size_t i=k; i<colnum; i++) {
		a = value(r1, i);
		set(r1, i, value(r2, i));
		set(r2, i, a);
	}
}

void matrix::swapc(size_t c1, size_t c2, size_t k) // 交換c1和c2兩列
{
	DOUBLE a;
	for(size_t i=k; i<colnum; i++) {
		a = value(i, c1);
		set(i, c1, value(i, c2));
		set(i, c2, a);
	}
}

DOUBLE matrix::maxabs(size_t &r, size_t &c, size_t k) // 求第k行和第k列后的主元及位置
{
	DOUBLE a=0.0;
	for(size_t i=k;i<rownum;i++)
	for(size_t j=k;j<colnum;j++)
		if(a < fabs(value(i,j))) {
			r=i;c=j;a=fabs(value(i,j));
		}
	return a;
}

size_t matrix::zgsxy(matrix & m, int fn) // 進(jìn)行主高斯消元運(yùn)算,fn為參數(shù),缺省為0
 /* 本矩陣其實是常數(shù)陣,而矩陣m必須是方陣

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩激情中文字幕| 欧美日高清视频| 国产乱理伦片在线观看夜一区| 日韩高清一区二区| 婷婷丁香激情综合| 日韩制服丝袜av| 日韩av一二三| 六月婷婷色综合| 国产资源精品在线观看| 国产一区二区0| 粉嫩久久99精品久久久久久夜 | 色屁屁一区二区| 91视频你懂的| 色av成人天堂桃色av| 欧日韩精品视频| 欧美妇女性影城| 日韩欧美黄色影院| 国产欧美综合在线观看第十页 | 亚洲一区二三区| 亚洲v日本v欧美v久久精品| 午夜视频在线观看一区二区 | 午夜久久久影院| 久草在线在线精品观看| 国产成a人无v码亚洲福利| 99精品久久免费看蜜臀剧情介绍 | 国产精品大尺度| 亚洲视频狠狠干| 亚洲国产一区二区a毛片| 免费看日韩精品| 国产精品一区二区三区99| 99久久99久久综合| 欧美性xxxxx极品少妇| 91精品中文字幕一区二区三区| 欧美成人精品3d动漫h| 中文字幕精品三区| 亚洲综合视频在线观看| 美女在线一区二区| 国产suv精品一区二区6| 欧洲中文字幕精品| 日韩免费看网站| 国产清纯在线一区二区www| 亚洲另类色综合网站| 日韩av电影天堂| 成人丝袜高跟foot| 欧美唯美清纯偷拍| 久久伊99综合婷婷久久伊| 亚洲免费观看在线观看| 免费亚洲电影在线| www.一区二区| 日韩一区二区三区三四区视频在线观看 | 成人激情电影免费在线观看| 精品污污网站免费看| 久久久精品国产免大香伊| 亚洲美女精品一区| 精品在线播放午夜| 91同城在线观看| 精品国内片67194| 亚洲激情自拍视频| 国产一区二区不卡| 欧美精品在欧美一区二区少妇| 久久亚洲精精品中文字幕早川悠里| 一二三四区精品视频| 成人福利视频网站| 亚洲精品一区二区三区精华液| 国产精品理论在线观看| 日韩不卡一区二区三区| 日本成人中文字幕| 欧美日韩成人综合| 一区二区三区视频在线看| 亚洲高清免费视频| 蜜桃视频一区二区三区在线观看| 粉嫩绯色av一区二区在线观看 | 国产在线精品免费av| 在线亚洲免费视频| 久久精品视频网| 日韩高清在线一区| 欧美吞精做爰啪啪高潮| 中文字幕av免费专区久久| 美女精品一区二区| 欧美电影影音先锋| 一区二区三区国产精华| 99精品国产91久久久久久| 久久久不卡影院| 久久精品国产精品亚洲精品| 欧美日韩精品电影| 亚洲国产视频一区二区| 91美女在线视频| 中文字幕佐山爱一区二区免费| 国产suv精品一区二区6| 久久一区二区三区四区| 麻豆国产91在线播放| 在线播放中文一区| 天使萌一区二区三区免费观看| 欧美性生活大片视频| 一区二区三区视频在线观看| 懂色av噜噜一区二区三区av| www激情久久| 美女任你摸久久 | 亚洲精品五月天| 色综合久久99| 亚洲最大色网站| 在线亚洲欧美专区二区| 亚洲成人动漫在线免费观看| 欧美性色欧美a在线播放| 亚洲一区二区欧美日韩| 欧美日韩精品久久久| 偷拍与自拍一区| 在线电影欧美成精品| 日本欧美一区二区三区乱码| 日韩午夜三级在线| 久久国产精品免费| 久久久国产精华| 成人av免费观看| 亚洲精品你懂的| 欧美三日本三级三级在线播放| 香蕉乱码成人久久天堂爱免费| 欧美另类变人与禽xxxxx| 日本成人中文字幕| 欧美精品一区二| 国产69精品久久久久毛片| 国产精品久久久久9999吃药| 色综合色狠狠综合色| 亚洲一区在线观看网站| 制服.丝袜.亚洲.另类.中文| 美脚の诱脚舐め脚责91| 国产欧美日韩在线| 91丨porny丨户外露出| 五月婷婷激情综合网| 日韩限制级电影在线观看| 韩国成人福利片在线播放| 国产精品嫩草影院av蜜臀| 色婷婷av一区二区三区gif| 水野朝阳av一区二区三区| 欧美成人一区二区三区片免费| 国产精品一区二区三区四区| 亚洲日本中文字幕区| 91精品婷婷国产综合久久竹菊| 精一区二区三区| 国产精品福利一区二区三区| 欧美色爱综合网| 国产福利精品一区二区| 亚洲欧美日韩国产中文在线| 56国语精品自产拍在线观看| 黄色精品一二区| 亚洲精选免费视频| 精品剧情在线观看| 99re成人精品视频| 日本大胆欧美人术艺术动态| 国产精品视频免费| 欧美日韩国产系列| 高清日韩电视剧大全免费| 亚洲一区免费观看| 国产日韩精品一区二区浪潮av| 日本高清不卡aⅴ免费网站| 美腿丝袜亚洲一区| 亚洲乱码日产精品bd| 欧美成人欧美edvon| 91色婷婷久久久久合中文| 麻豆精品在线看| 玉米视频成人免费看| 久久人人爽爽爽人久久久| 欧洲日韩一区二区三区| 国内精品在线播放| 亚洲mv在线观看| 中文字幕一区二区日韩精品绯色| 日韩视频在线你懂得| 欧美在线不卡一区| 豆国产96在线|亚洲| 蜜臀av亚洲一区中文字幕| 综合自拍亚洲综合图不卡区| 欧美tk—视频vk| 欧美日韩亚洲国产综合| 99热这里都是精品| 国模无码大尺度一区二区三区| 亚洲一区二区三区四区在线免费观看| 久久久影视传媒| 日韩午夜av电影| 日本精品一区二区三区四区的功能| 国产精品综合二区| 日本特黄久久久高潮 | 91激情五月电影| 国产成人小视频| 九九国产精品视频| 午夜精品一区在线观看| 亚洲激情综合网| 亚洲人成网站在线| 亚洲国产精品国自产拍av| 精品成人a区在线观看| 欧美精品第一页| 欧美专区日韩专区| 99国产一区二区三精品乱码| 国产东北露脸精品视频| 蜜芽一区二区三区| 亚洲www啪成人一区二区麻豆| 一区二区三区四区乱视频| 亚洲人成人一区二区在线观看| 中文子幕无线码一区tr| 国产无一区二区| 久久久精品tv| 中文字幕乱码亚洲精品一区 |