double getResidualNorm(int id, matrix a, vector x, vector y, double c, int size) { vector v1, v2; multiplyMatrixVector(a, x, size, v1); multiplyVectorConst(y, c, size); subVectors(v1, y, size, v2); return getVectorNorm(id, v2, size); }
CMatrix::MatrixError_t CMatrix::normalize_I( ActionAppliedTo_t eActionArea /*= kAll*/, int p /*= 1*/ ) { float fNorm; if (eActionArea == kAll) { fNorm = getNorm(p); if (fNorm <= 0) return kMatrixNoError; for (int i = 0; i < m_aiMatrixDimensions[kRow]; i++) CUtil::mulBuffC(m_ppfMatrix[i], 1.F/fNorm, m_aiMatrixDimensions[kCol]); } else if (eActionArea == kRow) { for (int i = 0; i < m_aiMatrixDimensions[kRow]; i++) { fNorm = getVectorNorm(i,-1,p); if (fNorm <= 0) return kMatrixNoError; CUtil::mulBuffC(m_ppfMatrix[i], 1.F/fNorm, m_aiMatrixDimensions[kCol]); } } else if (eActionArea == kCol) { for (int j = 0; j < m_aiMatrixDimensions[kCol]; j++) { fNorm = getVectorNorm(-1,j,p); if (fNorm <= 0) return kMatrixNoError; for (int i = 0; i < m_aiMatrixDimensions[kRow]; i++) m_ppfMatrix[i][j] /= fNorm; } } return kMatrixNoError; }
float CMatrix::getNorm( int p /*= 1*/ ) const { if (p<=0) return -1; float fResult = 0; if (p==1) { for (int j = 0; j < m_aiMatrixDimensions[kCol]; j++) { float fTmp = getVectorNorm(-1,j,p); //for (int i = 0; i < m_aiMatrixDimensions[kRow]; i++) // fTmp += abs(m_ppfMatrix[i][j]); if (fTmp > fResult) fResult = fTmp; } } else if (p == 2) { for (int i = 0; i < m_aiMatrixDimensions[kRow]; i++) { //float fTmp = getVectorNorm(i,-1,p); //fResult += fTmp * fTmp; fResult += CUtil::mulBuffScalar(m_ppfMatrix[i], m_ppfMatrix[i], m_aiMatrixDimensions[kCol]); } fResult = sqrt(fResult); } else { for (int i = 0; i < m_aiMatrixDimensions[kRow]; i++) for (int j = 0; j < m_aiMatrixDimensions[kCol]; j++) fResult += pow(m_ppfMatrix[i][j], 1.F*p); fResult = pow(fResult, 1.F/p); } return fResult; }
float CMatrix::getColNorm( int iCol, int p /*= 1*/ ) const { return getVectorNorm(-1, iCol, p); }
float CMatrix::getRowNorm( int iRow, int p /*= 1*/ ) const { return getVectorNorm(iRow, -1, p); }