VC++图像处理矩阵数组赋值问题
我做的VC++图像处理,用一个一维数组表示二维矩阵,对图像处理经常会对矩阵的某一行、某一列、某几行、某几列进行修改或者复制,这个修改或者赋值函数只能通过直接调用对应的数组来直接赋值,但是运算时间特别长,希望能给些建议 跪谢!!!!
我把我的矩阵给大家看看,函数也给大家看看,图像处理,对矩阵的某一行、某一列、某几行、某几列进行修改或者复制也给出来了,大家帮帮忙吧
class CMatrix
{
public:
int m_nNumColumns; // 矩阵列数
int m_nNumRows; // 矩阵行数
double* m_pData; // 矩阵数据缓冲区
};
//////////////////////////////////////////////////////////////////////
// 设置指定元素的值
//
// 参数:
// 1. int nRows - 指定的矩阵行数
// 2. int nCols - 指定的矩阵列数
// 3. double value - 指定元素的值
//
// 返回值:BOOL 型,说明设置是否成功
//////////////////////////////////////////////////////////////////////
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;
}
//////////////////////////////////////////////////////////////////////
// 设置指定元素的值
//
// 参数:
// 1. int nRows - 指定的矩阵行数
// 2. int nCols - 指定的矩阵列数
//
// 返回值: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];
}
//////////////////////////////////////////////////////////////////////
//对A矩阵的第h行赋值为m矩阵的第k行
//fuhangzhi(CMatrix A,int h, CMatrix m, int k)
//(Matlab) A=m(k,:)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:A矩阵和m矩阵必须列数一样
// 外部要求:必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuhangzhi(CMatrix A,int h,CMatrix m,int k)
{
k--;//区分matlab和vc++矩阵关系
h--;
for(int i=0;i<A.GetNumColumns();i++)
// A.m_pData[i + h*A.GetNumColumns()] =m.GetElement(k,i);
return A;
}
//////////////////////////////////////////////////////////////////////
//对A矩阵的第h列赋值为m矩阵的第k列
//fuliezhi(CMatrix A,int h, CMatrix m, int k)
//(Matlab) A=m(:,k)
//(VC++) 把m矩阵的k-1列赋值给A矩阵的h-1行
// 内部要求:A矩阵和m矩阵必须行数一样
// 外部要求:必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuliezhi(CMatrix A,int h,CMatrix m,int k)
{
//区分matlab和vc++矩阵关系
h--;
k--;
for(int i=0;i<A.GetNumRows();i++)
A.SetElement(i,h,m.GetElement(i,k));
return A;
}
//////////////////////////////////////////////////////////////////////
//对C矩阵的每一行,分别按照B矩阵从上到下、从左到右的顺序,
//取数值,得到A矩阵该数值的行赋值
//C.fuduohangzhi(CMatrix A, CMatrix B)
//(Matlab) C=A(B,); (A=this)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:(1) B矩阵的每个值必须小于A的列数
// (2) 必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuduohangzhi(CMatrix C,CMatrix A, CMatrix B)
{
//找到要求赋值的行号
int m;
int n,i,j;
//总行数
int sum= (B.GetNumRows())*(B.GetNumColumns());
for(n=0;n<sum;n++)
{
// j=n/(B.GetNumRows());
//i=n%(B.GetNumRows());
m=(int)B.GetElement(n,0);
C=fuhangzhi(C,n+1,A,m);
}
return C;
}
//////////////////////////////////////////////////////////////////////
//对C矩阵的每一列,分别按照B矩阵从上到下、从左到右的顺序,
//取数值,得到A矩阵该数值的列赋值
//A.fuduohangzhi(CMatrix A, CMatrix B)
//(Matlab) C=A(B,); (A=this)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:(1) B矩阵的每个值必须小于A的列数
// (2) 必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuduoliezhi(CMatrix C,CMatrix A, CMatrix B)
{
//找到要求赋值的行号
int m;
int n,i,j;
//总行数
int sum= (B.GetNumRows())*(B.GetNumColumns());
for(n=0;n<sum;n++)
{
j=n/(B.GetNumRows());
i=n%(B.GetNumRows());
m=(int)B.GetElement(i,j);
C=fuliezhi(C,n+1,A,m);
}
return C;
}