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

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

?? matrix.cpp

?? 關(guān)于矩陣運(yùn)算的各種數(shù)值算法
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
//////////////////////////////////////////////////////////////////////
// Matrix.cpp
//
// 操作矩陣的類 CMatrix 的實(shí)現(xiàn)文件
//
// 周長(zhǎng)發(fā)編制, 2002/8
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Matrix.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// 基本構(gòu)造函數(shù)
//////////////////////////////////////////////////////////////////////
CMatrix::CMatrix()
{
	m_nNumColumns = 1;
	m_nNumRows = 1;
	m_pData = NULL;
	BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);
	ASSERT(bSuccess);
}

//////////////////////////////////////////////////////////////////////
// 指定行列構(gòu)造函數(shù)
//
// 參數(shù):
// 1. int nRows - 指定的矩陣行數(shù)
// 2. int nCols - 指定的矩陣列數(shù)
//////////////////////////////////////////////////////////////////////
CMatrix::CMatrix(int nRows, int nCols)
{
	m_nNumRows = nRows;
	m_nNumColumns = nCols;
	m_pData = NULL;
	BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);
	ASSERT(bSuccess);
}

//////////////////////////////////////////////////////////////////////
// 指定值構(gòu)造函數(shù)
//
// 參數(shù):
// 1. int nRows - 指定的矩陣行數(shù)
// 2. int nCols - 指定的矩陣列數(shù)
// 3. double value[] - 一維數(shù)組,長(zhǎng)度為nRows*nCols,存儲(chǔ)矩陣各元素的值
//////////////////////////////////////////////////////////////////////
CMatrix::CMatrix(int nRows, int nCols, double value[])
{
	m_nNumRows = nRows;
	m_nNumColumns = nCols;
	m_pData = NULL;
	BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);
	ASSERT(bSuccess);

	SetData(value);
}

//////////////////////////////////////////////////////////////////////
// 方陣構(gòu)造函數(shù)
//
// 參數(shù):
// 1. int nSize - 方陣行列數(shù)
//////////////////////////////////////////////////////////////////////
CMatrix::CMatrix(int nSize)
{
	m_nNumRows = nSize;
	m_nNumColumns = nSize;
	m_pData = NULL;
	BOOL bSuccess = Init(nSize, nSize);
	ASSERT (bSuccess);
}

//////////////////////////////////////////////////////////////////////
// 方陣構(gòu)造函數(shù)
//
// 參數(shù):
// 1. int nSize - 方陣行列數(shù)
// 2. double value[] - 一維數(shù)組,長(zhǎng)度為nRows*nRows,存儲(chǔ)方陣各元素的值
//////////////////////////////////////////////////////////////////////
CMatrix::CMatrix(int nSize, double value[])
{
	m_nNumRows = nSize;
	m_nNumColumns = nSize;
	m_pData = NULL;
	BOOL bSuccess = Init(nSize, nSize);
	ASSERT (bSuccess);

	SetData(value);
}

//////////////////////////////////////////////////////////////////////
// 拷貝構(gòu)造函數(shù)
//
// 參數(shù):
// 1. const CMatrix& other - 源矩陣
//////////////////////////////////////////////////////////////////////
CMatrix::CMatrix(const CMatrix& other)
{
	m_nNumColumns = other.GetNumColumns();
	m_nNumRows = other.GetNumRows();
	m_pData = NULL;
	BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);
	ASSERT(bSuccess);

	// copy the pointer
	memcpy(m_pData, other.m_pData, sizeof(double)*m_nNumColumns*m_nNumRows);
}

//////////////////////////////////////////////////////////////////////
// 析構(gòu)函數(shù)
//////////////////////////////////////////////////////////////////////
CMatrix::~CMatrix()
{
	if (m_pData)
	{
		delete[] m_pData;
		m_pData = NULL;
	}
}

//////////////////////////////////////////////////////////////////////
// 初始化函數(shù)
//
// 參數(shù):
// 1. int nRows - 指定的矩陣行數(shù)
// 2. int nCols - 指定的矩陣列數(shù)
//
// 返回值:BOOL 型,初始化是否成功
//////////////////////////////////////////////////////////////////////
BOOL CMatrix::Init(int nRows, int nCols)
{
	if (m_pData)
	{
		delete[] m_pData;
		m_pData = NULL;
	}

	m_nNumRows = nRows;
	m_nNumColumns = nCols;
	int nSize = nCols*nRows;
	if (nSize < 0)
		return FALSE;

	// 分配內(nèi)存
	m_pData = new double[nSize];
	
	if (m_pData == NULL)
		return FALSE;					// 內(nèi)存分配失敗
	if (IsBadReadPtr(m_pData, sizeof(double) * nSize))
		return FALSE;

	// 將各元素值置0
	memset(m_pData, 0, sizeof(double) * nSize);

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 將方陣初始化為單位矩陣
//
// 參數(shù):
// 1. int nSize - 方陣行列數(shù)
//
// 返回值:BOOL 型,初始化是否成功
//////////////////////////////////////////////////////////////////////
BOOL CMatrix::MakeUnitMatrix(int nSize)
{
	if (! Init(nSize, nSize))
		return FALSE;

	for (int i=0; i<nSize; ++i)
		for (int j=0; j<nSize; ++j)
			if (i == j)
				SetElement(i, j, 1);

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 將字符串轉(zhuǎn)化為矩陣的值
//
// 參數(shù):
// 1. CString s - 數(shù)字和分隔符構(gòu)成的字符串
// 2. const CString& sDelim - 數(shù)字之間的分隔符,默認(rèn)為空格
// 3. BOOL bLineBreak - 行與行之間是否有回車換行符,默認(rèn)為真(有換行符)
//         當(dāng)該參數(shù)為FALSE時(shí),所有元素值都在一行中輸入,字符串的第一個(gè)
//         數(shù)值應(yīng)為矩陣的行數(shù),第二個(gè)數(shù)值應(yīng)為矩陣的列數(shù)
//
// 返回值:BOOL 型,轉(zhuǎn)換是否成功
//////////////////////////////////////////////////////////////////////
BOOL CMatrix::FromString(CString s, const CString& sDelim /*= " "*/, BOOL bLineBreak /*= TRUE*/)
{
	if (s.IsEmpty())
		return FALSE;

	// 分行處理
	if (bLineBreak)
	{
		CTokenizer tk(s, "\r\n");

		CStringList ListRow;
		CString sRow;
		while (tk.Next(sRow))
		{
			sRow.TrimLeft();
			sRow.TrimRight();
			if (sRow.IsEmpty())
				break;

			ListRow.AddTail(sRow);
		}

		// 行數(shù)
		m_nNumRows = ListRow.GetCount();

		sRow = ListRow.GetHead();
		CTokenizer tkRow(sRow, sDelim);
		CString sElement;
		// 列數(shù)
		m_nNumColumns = 0;
		while (tkRow.Next(sElement))
		{
			m_nNumColumns++;
		}

		// 初始化矩陣
		if (! Init(m_nNumRows, m_nNumColumns))
			return FALSE;

		// 設(shè)置值
		POSITION pos = ListRow.GetHeadPosition();
		for (int i=0; i<m_nNumRows; i++)
		{
			sRow = ListRow.GetNext(pos);
			int j = 0;
			CTokenizer tkRow(sRow, sDelim);
			while (tkRow.Next(sElement))
			{
				sElement.TrimLeft();
				sElement.TrimRight();
				double v = atof(sElement);
				SetElement(i, j++, v);
			}
		}

		return TRUE;
	}
	
	// 不分行(單行)處理

	CTokenizer tk(s, sDelim);

	CString sElement;
	
	// 行數(shù)
	tk.Next(sElement);
	sElement.TrimLeft();
	sElement.TrimRight();
	m_nNumRows = atoi(sElement);

	// 列數(shù)
	tk.Next(sElement);
	sElement.TrimLeft();
	sElement.TrimRight();
	m_nNumColumns = atoi(sElement);

	// 初始化矩陣
	if (! Init(m_nNumRows, m_nNumColumns))
		return FALSE;

	// 設(shè)置值
	int i = 0, j = 0;
	while (tk.Next(sElement))
	{
		sElement.TrimLeft();
		sElement.TrimRight();
		double v = atof(sElement);
		SetElement(i, j++, v);

		if (j == m_nNumColumns)
		{
			j = 0;
			i++;
			if (i == m_nNumRows)
				break;
		}
	}

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 將矩陣各元素的值轉(zhuǎn)化為字符串
//
// 參數(shù):
// 1. const CString& sDelim - 數(shù)字之間的分隔符,默認(rèn)為空格
// 2 BOOL bLineBreak - 行與行之間是否有回車換行符,默認(rèn)為真(有換行符)
//
// 返回值:CString 型,轉(zhuǎn)換得到的字符串
//////////////////////////////////////////////////////////////////////
CString CMatrix::ToString(const CString& sDelim /*= " "*/, BOOL bLineBreak /*= TRUE*/) const
{
	CString s="";

	for (int i=0; i<m_nNumRows; ++i)
	{
		for (int j=0; j<m_nNumColumns; ++j)
		{
			CString ss;
			ss.Format("%f", GetElement(i, j));
			s += ss;

			if (bLineBreak)
			{
				if (j != m_nNumColumns-1)
					s += sDelim;
			}
			else
			{
				if (i != m_nNumRows-1 || j != m_nNumColumns-1)
					s += sDelim;
			}
		}
		if (bLineBreak)
			if (i != m_nNumRows-1)
				s += "\r\n";
	}

	return s;
}

//////////////////////////////////////////////////////////////////////
// 將矩陣指定行中各元素的值轉(zhuǎn)化為字符串
//
// 參數(shù):
// 1. int nRow - 指定的矩陣行,nRow = 0表示第一行
// 2. const CString& sDelim - 數(shù)字之間的分隔符,默認(rèn)為空格
//
// 返回值:CString 型,轉(zhuǎn)換得到的字符串
//////////////////////////////////////////////////////////////////////
CString CMatrix::RowToString(int nRow, const CString& sDelim /*= " "*/) const
{
	CString s = "";

	if (nRow >= m_nNumRows)
		return s;

	for (int j=0; j<m_nNumColumns; ++j)
	{
		CString ss;
		ss.Format("%f", GetElement(nRow, j));
		s += ss;
		if (j != m_nNumColumns-1)
			s += sDelim;
	}

	return s;
}

//////////////////////////////////////////////////////////////////////
// 將矩陣指定列中各元素的值轉(zhuǎn)化為字符串
//
// 參數(shù):
// 1. int nCol - 指定的矩陣行,nCol = 0表示第一列
// 2. const CString& sDelim - 數(shù)字之間的分隔符,默認(rèn)為空格
//
// 返回值:CString 型,轉(zhuǎn)換得到的字符串
//////////////////////////////////////////////////////////////////////
CString CMatrix::ColToString(int nCol, const CString& sDelim /*= " "*/) const
{
	CString s = "";

	if (nCol >= m_nNumColumns)
		return s;

	for (int i=0; i<m_nNumRows; ++i)
	{
		CString ss;
		ss.Format("%f", GetElement(i, nCol));
		s += ss;
		if (i != m_nNumRows-1)
			s += sDelim;
	}

	return s;
}

//////////////////////////////////////////////////////////////////////
// 設(shè)置矩陣各元素的值
//
// 參數(shù):
// 1. double value[] - 一維數(shù)組,長(zhǎng)度為m_nNumColumns*m_nNumRows,存儲(chǔ)
//                     矩陣各元素的值
//
// 返回值:無(wú)
//////////////////////////////////////////////////////////////////////
void CMatrix::SetData(double value[])
{
	// empty the memory
	memset(m_pData, 0, sizeof(double) * m_nNumColumns*m_nNumRows);
	// copy data
	memcpy(m_pData, value, sizeof(double)*m_nNumColumns*m_nNumRows);
}

//////////////////////////////////////////////////////////////////////
// 設(shè)置指定元素的值
//
// 參數(shù):
// 1. int nRows - 指定的矩陣行數(shù)
// 2. int nCols - 指定的矩陣列數(shù)
// 3. double value - 指定元素的值
//
// 返回值:BOOL 型,說(shuō)明設(shè)置是否成功
//////////////////////////////////////////////////////////////////////
BOOL CMatrix::SetElement(int nRow, int nCol, double value)
{
	if (nCol < 0 || nCol >= m_nNumColumns || nRow < 0 || nRow >= m_nNumRows)
		return FALSE;						// array bounds error
	if (m_pData == NULL)
		return FALSE;							// bad pointer error
	
	m_pData[nCol + nRow * m_nNumColumns] = value;

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 設(shè)置指定元素的值
//
// 參數(shù):
// 1. int nRows - 指定的矩陣行數(shù)
// 2. int nCols - 指定的矩陣列數(shù)
//
// 返回值:double 型,指定元素的值
//////////////////////////////////////////////////////////////////////
double CMatrix::GetElement(int nRow, int nCol) const
{
	ASSERT(nCol >= 0 && nCol < m_nNumColumns && nRow >= 0 && nRow < m_nNumRows); // array bounds error
	ASSERT(m_pData);							// bad pointer error
	return m_pData[nCol + nRow * m_nNumColumns] ;
}

//////////////////////////////////////////////////////////////////////
// 獲取矩陣的列數(shù)
//
// 參數(shù):無(wú)
//
// 返回值:int 型,矩陣的列數(shù)
//////////////////////////////////////////////////////////////////////
int	CMatrix::GetNumColumns() const
{
	return m_nNumColumns;
}

//////////////////////////////////////////////////////////////////////
// 獲取矩陣的行數(shù)
//
// 參數(shù):無(wú)
//
// 返回值:int 型,矩陣的行數(shù)
//////////////////////////////////////////////////////////////////////
int	CMatrix::GetNumRows() const
{
	return m_nNumRows;
}

//////////////////////////////////////////////////////////////////////
// 獲取矩陣的數(shù)據(jù)
//
// 參數(shù):無(wú)
//
// 返回值:double型指針,指向矩陣各元素的數(shù)據(jù)緩沖區(qū)
//////////////////////////////////////////////////////////////////////
double* CMatrix::GetData() const
{
	return m_pData;
}

//////////////////////////////////////////////////////////////////////
// 獲取指定行的向量
//
// 參數(shù):
// 1. int nRows - 指定的矩陣行數(shù)
// 2.  double* pVector - 指向向量中各元素的緩沖區(qū)
//
// 返回值:int 型,向量中元素的個(gè)數(shù),即矩陣的列數(shù)
//////////////////////////////////////////////////////////////////////
int CMatrix::GetRowVector(int nRow, double* pVector) const
{
	if (pVector == NULL)
		delete pVector;

	pVector = new double[m_nNumColumns];
	ASSERT(pVector != NULL);

	for (int j=0; j<m_nNumColumns; ++j)
		pVector[j] = GetElement(nRow, j);

	return m_nNumColumns;
}

//////////////////////////////////////////////////////////////////////
// 獲取指定列的向量
//
// 參數(shù):
// 1. int nCols - 指定的矩陣列數(shù)
// 2.  double* pVector - 指向向量中各元素的緩沖區(qū)
//
// 返回值:int 型,向量中元素的個(gè)數(shù),即矩陣的行數(shù)
//////////////////////////////////////////////////////////////////////
int CMatrix::GetColVector(int nCol, double* pVector) const
{
	if (pVector == NULL)
		delete pVector;

	pVector = new double[m_nNumRows];
	ASSERT(pVector != NULL);

	for (int i=0; i<m_nNumRows; ++i)
		pVector[i] = GetElement(i, nCol);

	return m_nNumRows;
}

//////////////////////////////////////////////////////////////////////
// 重載運(yùn)算符=,給矩陣賦值
//
// 參數(shù):
// 1. const CMatrix& other - 用于給矩陣賦值的源矩陣

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费观看av| 狠狠色丁香久久婷婷综合_中| 国产一区二区三区综合| 欧美一区二区三区四区五区| 九色|91porny| 亚洲欧美中日韩| 欧美在线短视频| 另类的小说在线视频另类成人小视频在线 | 激情综合色丁香一区二区| 日韩精品一区二区三区视频在线观看 | 中文成人综合网| 欧美在线看片a免费观看| 午夜精品久久久久久久久久| 久久综合成人精品亚洲另类欧美| 97se亚洲国产综合自在线不卡| 午夜激情久久久| 国产精品乱人伦一区二区| 4438x亚洲最大成人网| 国产a久久麻豆| 日本一区中文字幕| 亚洲视频每日更新| 久久久www成人免费毛片麻豆| 欧美网站大全在线观看| 国产成人av一区| 热久久国产精品| 国产免费久久精品| 欧美大度的电影原声| 欧美亚洲高清一区| 成人v精品蜜桃久久一区| 国产最新精品免费| 视频在线观看一区二区三区| 中文字幕五月欧美| 26uuu亚洲婷婷狠狠天堂| 欧美精品亚洲二区| 91蜜桃传媒精品久久久一区二区| 国产精品中文字幕一区二区三区| 天天影视涩香欲综合网| 国产精品青草久久| 国产网站一区二区| 26uuu国产日韩综合| 日韩精品一区在线观看| 在线播放91灌醉迷j高跟美女| 91小视频在线| 99久久精品一区二区| 大陆成人av片| 国产成人精品影视| 丰满放荡岳乱妇91ww| 国产成人在线影院 | 国产精品一色哟哟哟| 美女网站视频久久| 另类小说视频一区二区| 久久精品国产亚洲5555| 美腿丝袜亚洲综合| 久久精品国产一区二区| 久久爱www久久做| 久久国产精品一区二区| 国产曰批免费观看久久久| 国产乱人伦精品一区二区在线观看 | 国产亚洲精品bt天堂精选| 久久久久国产精品厨房| 久久精品视频在线看| 国产日韩欧美麻豆| 成人欧美一区二区三区小说| 亚洲国产精品t66y| 中文字幕一区二区不卡| 亚洲女人****多毛耸耸8| 中文字幕在线一区| 怡红院av一区二区三区| 午夜精品久久一牛影视| 青草国产精品久久久久久| 久久精品国产一区二区三区免费看| 蜜芽一区二区三区| 国产不卡视频一区| 色美美综合视频| 91精品国产免费| 亚洲国产岛国毛片在线| 亚洲精品日韩综合观看成人91| 午夜久久电影网| 国产自产2019最新不卡| 色哟哟欧美精品| 日韩精品在线看片z| 国产精品二区一区二区aⅴ污介绍| 亚洲精品国产精华液| 青青国产91久久久久久| 大美女一区二区三区| 欧美日韩一级黄| 欧美国产一区二区在线观看| 亚洲最大的成人av| 久久成人免费电影| 在线日韩一区二区| 久久久久久久性| 日日摸夜夜添夜夜添亚洲女人| 日本特黄久久久高潮| 亚洲精品国久久99热| 精品一区二区三区av| 91高清视频在线| 欧美国产激情一区二区三区蜜月| 亚洲成人1区2区| 成人va在线观看| 精品国产一区二区国模嫣然| 亚洲欧美日韩久久精品| 国产一区在线不卡| 欧美肥大bbwbbw高潮| 久久精品这里都是精品| 日韩专区在线视频| av高清不卡在线| 2020国产精品自拍| 日本网站在线观看一区二区三区| 丰满少妇久久久久久久| 精品国产一区久久| 日韩精品色哟哟| 91成人免费在线| 成人免费小视频| 粉嫩一区二区三区在线看| 精品免费一区二区三区| 日韩精品一二三区| 欧美日韩亚洲综合在线 | 国产精品资源站在线| 日韩欧美专区在线| 日日夜夜精品视频天天综合网| 成人av片在线观看| 国产校园另类小说区| 国产乱子轮精品视频| 日韩视频在线永久播放| 日本亚洲免费观看| 91精品国产综合久久福利| 午夜精品一区二区三区电影天堂| 色综合视频一区二区三区高清| 国产精品传媒入口麻豆| 成人性生交大合| 国产精品伦理一区二区| 99视频在线精品| 亚洲青青青在线视频| 欧美天堂亚洲电影院在线播放| 亚洲最色的网站| 欧美日本一道本| 精品中文字幕一区二区| 久久在线观看免费| 国产成人久久精品77777最新版本| 国产女人18毛片水真多成人如厕| 成人白浆超碰人人人人| 亚洲欧美电影一区二区| 欧美日韩一区二区三区免费看| 五月天精品一区二区三区| 欧美一二三区精品| 国产成人综合在线播放| 亚洲三级久久久| 欧美人与性动xxxx| 国产美女在线精品| 亚洲色图在线播放| 7777精品伊人久久久大香线蕉超级流畅 | 91精品久久久久久久99蜜桃| 日韩av一级电影| 久久人人爽人人爽| 99久久夜色精品国产网站| 一区二区三区在线播| 日韩一区二区免费在线观看| 国产精品一区二区91| 亚洲免费在线视频一区 二区| 欧美日韩激情在线| 国产精品一二三区在线| 亚洲免费成人av| 精品三级av在线| 91福利国产成人精品照片| 男人操女人的视频在线观看欧美 | 丁香天五香天堂综合| 亚洲国产中文字幕| 久久九九国产精品| 欧美丰满少妇xxxxx高潮对白| 国产不卡视频在线播放| 日韩精品乱码免费| 日韩精品中文字幕在线不卡尤物| 在线一区二区视频| 国产精品一区一区| 亚洲3atv精品一区二区三区| 国产偷国产偷精品高清尤物| 欧美日韩亚洲国产综合| 99麻豆久久久国产精品免费| 精品一区二区三区视频| 亚洲一级在线观看| 中文字幕在线观看不卡| 26uuu精品一区二区在线观看| 欧美人妇做爰xxxⅹ性高电影| 成人激情免费视频| 国产精品影视在线| 久久国产夜色精品鲁鲁99| 亚洲午夜激情av| 国产精品不卡在线| 中文一区在线播放 | 看电视剧不卡顿的网站| 亚洲一区在线播放| 亚洲欧美成人一区二区三区| 国产精品天干天干在观线| 精品国产乱码久久久久久老虎 | 国产精品视频免费看| 欧美精品一区二区三区高清aⅴ| 91麻豆精品国产无毒不卡在线观看 | 精品中文字幕一区二区小辣椒| 亚洲成av人片| 亚洲高清视频中文字幕|