?? matrix.cpp
字號(hào):
}
}
}
/////////////////////////////////////////////////////////////////////////////
// InitializeZero()
// 矩陣初始化函數(shù),矩陣的行列數(shù)目被初始化為零,矩陣中的元素全部初始化為零
/////////////////////////////////////////////////////////////////////////////
void CMatrix::InitializeZero()
{
m_nRow = 0;
m_nCol = 0;
m_pTMatrix.resize (m_nRow);
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix[i].resize (m_nCol);
m_pTMatrix[i][j] = (double) 0;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// RandomInitialize()
// 將矩陣中的元素隨機(jī)初始化函數(shù),元素的值在(-1,1)之間的小數(shù)
/////////////////////////////////////////////////////////////////////////////
void CMatrix::RandomInitialize ()
{
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix [i][j] = (double)(rand() - (0.5*RAND_MAX)) / (0.5*RAND_MAX);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 拷貝矩陣的子矩陣元素到另外一個(gè)矩陣中
// Parameter:
// [out] cMatrix ----> 矩陣的子矩陣返回的結(jié)果
// [in] nStartX ----> 子矩陣在矩陣中的起始坐標(biāo),對(duì)應(yīng)行,索引從1開(kāi)始
// [in] nStartY ----> 子矩陣在矩陣中的起始坐標(biāo),對(duì)應(yīng)列,索引從1開(kāi)始
/////////////////////////////////////////////////////////////////////////////
void CMatrix::CopySubMatrix(CMatrix& cMatrix,unsigned int nStartX,unsigned int nStartY)
{
if((m_nRow < cMatrix.m_nRow + nStartY ) | (m_nCol < cMatrix.m_nCol + nStartX))
{
::AfxMessageBox (TEXT("被拷貝的矩陣維數(shù)小于要拷貝的矩陣所需要的維數(shù)!"),MB_OK | MB_ICONERROR);
return;
}
for(unsigned int i=0; i < cMatrix.m_nRow; i++)
{
for(unsigned int j=0; j < cMatrix.m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = m_pTMatrix [nStartY + i][nStartX + j];
}
}
}
/////////////////////////////////////////////////////////////////////////////
// Copy Matrix
// Parameter:
// [in] cMatrix ----> 被拷貝的矩陣
/////////////////////////////////////////////////////////////////////////////
void CMatrix::CopyMatrix(CMatrix& cMatrix)
{
m_nRow = cMatrix.m_nRow ;
m_nCol = cMatrix.m_nCol ;
m_pTMatrix = cMatrix.m_pTMatrix ;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix [i][j] = cMatrix.m_pTMatrix [i][j];
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 從一個(gè)列向量中拷貝數(shù)據(jù)到一個(gè)矩陣中
// Parameter:
// [out] cMatrix ----> 函數(shù)的返回結(jié)果
// [in] nIndex ----> 在列向量中的索引值
// Notes:
// 被拷貝的對(duì)象必須是列向量!!!
/////////////////////////////////////////////////////////////////////////////
void CMatrix::CopySubMatrixFromVector(CMatrix& cMatrix,unsigned int nIndex)
{
if(m_nCol != 1)
{
::AfxMessageBox (TEXT("被拷貝的矩陣不是列向量!!!"),MB_OK | MB_ICONERROR);
return;
}
for(unsigned int j=0; j < cMatrix.m_nCol; j++)
{
for(unsigned int i=0; i < cMatrix.m_nRow; i++)
{
cMatrix.m_pTMatrix [i][j] = m_pTMatrix [nIndex + j * cMatrix.m_nRow + i ][(unsigned int)0];
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣進(jìn)列拓展
// 實(shí)現(xiàn)功能:
// 對(duì)矩陣的列數(shù)進(jìn)行拓展,nTimes是每列拓展的次數(shù)
/////////////////////////////////////////////////////////////////////////////
void CMatrix::nncpyi(CMatrix &cMatrix, unsigned int nTimes)
{
m_nRow = cMatrix.m_nRow ;
m_nCol = cMatrix.m_nCol * nTimes;
// 根據(jù)空間分配內(nèi)存
m_pTMatrix.resize (m_nRow);
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix[i].resize (m_nCol);
m_pTMatrix[i][j] = (double) 0;
}
}
// 賦值
for(i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < cMatrix.m_nCol; j++)
{
for(unsigned int k=0; k < nTimes; k++)
{
m_pTMatrix [i][j * nTimes + k] = cMatrix.m_pTMatrix [i][j];
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣進(jìn)行拓展
// 實(shí)現(xiàn)功能:
// 對(duì)矩陣的列數(shù)進(jìn)行拓展
// matrix = [
// 1 2 3
// 4 5 6
// 7 8 9
// ]
//
// nncpyd(matrix) = [
// 1 0 0 2 0 0 3 0 0
// 0 4 0 0 5 0 0 6 0
// 0 0 7 0 0 8 0 0 9
// ]
/////////////////////////////////////////////////////////////////////////////
void CMatrix::nncpyd(CMatrix &cMatrix)
{
m_nRow = cMatrix.m_nRow ;
m_nCol = cMatrix.m_nCol * cMatrix.m_nRow ;
// 根據(jù)空間分配內(nèi)存
m_pTMatrix.resize (m_nRow);
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix[i].resize (m_nCol);
m_pTMatrix[i][j] = (double) 0;
}
}
// 給矩陣賦值
for(i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < cMatrix.m_nCol; j++)
{
for(unsigned int k=0; k < cMatrix.m_nRow; k++)
{
if(i == (j * cMatrix.m_nRow + k) % cMatrix.m_nRow )
m_pTMatrix [i][j * cMatrix.m_nRow + k] = cMatrix.m_pTMatrix [i][j];
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣進(jìn)行拓展
// 實(shí)現(xiàn)功能:
// 對(duì)矩陣的列數(shù)進(jìn)行拓展,nTimes是每列拓展的次數(shù)
// matrix = [
// 1 2 3
// 4 5 6
// 7 8 9
// ]
// nTimes = 2
//
// nncpyd(matrix) = [
// 1 2 3 1 2 3
// 4 5 6 4 5 6
// 7 8 9 7 8 9
// ]
/////////////////////////////////////////////////////////////////////////////
void CMatrix::nncpy(CMatrix& cMatrix,unsigned int nTimes)
{
m_nRow = cMatrix.m_nRow ;
m_nCol = cMatrix.m_nCol * nTimes;
// 根據(jù)空間分配內(nèi)存
m_pTMatrix.resize (m_nRow);
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix[i].resize (m_nCol);
m_pTMatrix[i][j] = (double) 0;
}
}
// 對(duì)矩陣賦值
for(i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < nTimes; j++)
{
{
m_pTMatrix [i][j * cMatrix.m_nCol + k] = cMatrix.m_pTMatrix [i][k];
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中所有的元素進(jìn)行一次非線性變換:
// 變換后的值y與變換前的值的關(guān)系是:
// y = f(x) = 1 / (1 + exp(-x)) ( 0 < f(x) < 1)
//
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::Sigmoid()
{
CMatrix cMatrix = *this;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = 1 / (1 + exp(-m_pTMatrix [i][j]));
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中所有的元素進(jìn)行一次非線性變換:
// 變換后的值y與變換前的值的關(guān)系是:
// y = tanh(x) = (1 - exp(-x)) / (1 + exp(-x))
// = 1 - 2 * exp(-x) / (1 + exp(-x)) ( -1 < f(x) < 1)
//
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::tanh ()
{
CMatrix cMatrix = *this;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = 1 - (2 * exp(-m_pTMatrix [i][j])) / (1 + exp(-m_pTMatrix [i][j]));
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中所有的元素進(jìn)行一次非線性變換:
// 變換后的值y與變換前的值的關(guān)系是:
// y = Tansig(x) = 2 / (1 + exp(-2 * x)) -1
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::Tansig()
{
CMatrix cMatrix = *this;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = 2 / (1 + exp(- 2 * m_pTMatrix [i][j])) - 1;
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中所有的元素進(jìn)行一次非線性變換:
// 變換后的值y與變換前的值的關(guān)系是:
// y = Tansig'(x) = (2 / (1 + exp(-2 * x)) -1)'
// = (2 / (1 + exp(-2 * x)) -1) * (2 / (1 + exp(-2 * x)) -1) -1
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::TansigDerivative()
{
CMatrix cMatrix = *this;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = (2 / (1 + exp(- 2 * m_pTMatrix [i][j])) - 1) * (2 / (1 + exp(- 2 * m_pTMatrix [i][j])) - 1) - 1;
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中的元素進(jìn)行一次操作:
// 使所有行中的相對(duì)應(yīng)的列元素相等
// Parameter:
// nRowIndex ----> 行索引值(從零開(kāi)始)
// 以此行做為標(biāo)準(zhǔn),使矩陣中其余的行相對(duì)應(yīng)的列的值
// 與此行相對(duì)應(yīng)的列的值相等
/////////////////////////////////////////////////////////////////////////////
void CMatrix::MakeAllColumnElementsSameValue(unsigned int nRowIndex)
{
for(unsigned int i=0; i < m_nRow; i++)
{
if(i == nRowIndex)
continue;
for(unsigned int j=0; j < m_nCol; j++)
{
m_pTMatrix [i][j] = m_pTMatrix [nRowIndex][j];
}
}
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中所有的元素進(jìn)行一次非線性變換:
// 變換后的值y與變換前的值的關(guān)系是:
// y = f'(x) = (1 / (1 + exp(-x)))' ( 0 < f(x) < 1)
// = exp(-x)/((1 + exp(-x))*(1 + exp(-x)))
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::SigmoidDerivative()
{
CMatrix cMatrix = *this;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = exp(-m_pTMatrix [i][j]) / ((1 + exp(-m_pTMatrix [i][j])) * (1 + exp(-m_pTMatrix [i][j])));
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 對(duì)矩陣中所有的元素進(jìn)行一次非線性變換:
// 變換后的值y與變換前的值的關(guān)系是:
// y = tanh'(x) = ((1 - exp(-x)) / (1 + exp(-x)))' ( -1 < f(x) < 1)
// = 2*exp(-x)/((1 + exp(-x))*(1 + exp(-x)))
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::tanhDerivative()
{
CMatrix cMatrix = *this;
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = 2 * exp(-m_pTMatrix [i][j]) / ((1 + exp(-m_pTMatrix [i][j])) * (1 + exp(-m_pTMatrix [i][j])));
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 實(shí)現(xiàn)對(duì)點(diǎn)乘操作符的重載
/////////////////////////////////////////////////////////////////////////////
CMatrix CMatrix::operator / (CMatrix& cMatrixB)
{
CMatrix cMatrix = *this;
if( (m_nRow != cMatrixB.m_nRow) || (m_nCol != cMatrixB.m_nCol) )
{
::AfxMessageBox (TEXT("兩個(gè)矩陣的維數(shù)不相等,不滿足矩陣點(diǎn)乘的條件!"),MB_OK | MB_ICONERROR);
return cMatrix; // return a invalid value
}
for(unsigned int i=0; i < m_nRow; i++)
{
for(unsigned int j=0; j < m_nCol; j++)
{
cMatrix.m_pTMatrix [i][j] = m_pTMatrix [i][j] * cMatrixB.m_pTMatrix [i][j];
}
}
return cMatrix;
}
//***************************************************************************
// ordinary function
//
/////////////////////////////////////////////////////////////////////////////
// 重載 'double - CMatrix' 運(yùn)算符
/////////////////////////////////////////////////////////////////////////////
CMatrix operator - (double nValue,CMatrix& cMatrixB)
{
CMatrix cMatrix = cMatrixB;
for(unsigned int i=0; i < cMatrix.GetMatrixRowNumber (); i++)
{
for(unsigned int j=0; j < cMatrix.GetMatrixColNumber (); j++)
{
cMatrix.m_pTMatrix [i][j] = nValue - cMatrixB.m_pTMatrix [i][j];
}
}
return cMatrix;
}
/////////////////////////////////////////////////////////////////////////////
// 矩陣合并運(yùn)算符
// 合并規(guī)則:
// 1. 參與合并運(yùn)算的兩個(gè)矩陣的行數(shù)必須相等;
// 2. 參與合并的兩個(gè)矩陣的列數(shù)可以不相等;
// 3. 合并后返回的矩陣的行數(shù)與參與合并的矩陣的行數(shù)相等,列數(shù)是參與合并的
// 兩個(gè)矩陣的列數(shù)之和;
/////////////////////////////////////////////////////////////////////////////
CMatrix MergeMatrix(CMatrix& cMatrixA,CMatrix& cMatrixB)
{
// 條件檢測(cè)
if( cMatrixA.GetMatrixRowNumber () != cMatrixB.GetMatrixRowNumber () )
{
::AfxMessageBox (TEXT("參與合并的兩個(gè)矩陣的行數(shù)不相等!"),MB_OK | MB_ICONERROR);
return cMatrixA; // return invalid value
}
CMatrix cMatrix(cMatrixA.GetMatrixRowNumber (),cMatrixA.GetMatrixColNumber () + cMatrixB.GetMatrixColNumber ());
for(unsigned int i=0; i < cMatrixA.GetMatrixRowNumber (); i++)
{
for(unsigned int j=0; j < cMatrixA.GetMatrixColNumber (); j++)
{
cMatrix.m_pTMatrix [i][j] = cMatrixA.m_pTMatrix [i][j];
}
for(unsigned int k=0; k < cMatrixB.GetMatrixColNumber (); k++)
{
cMatrix.m_pTMatrix [i][cMatrixA.GetMatrixColNumber () + k] = cMatrixB.m_pTMatrix [i][k];
}
}
return cMatrix;
}
// End of ordinary function
//***************************************************************************
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -