VC++图像处理矩阵数组赋值问题

左老师的小迷弟 2013-04-30 12:38:11
我做的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;
}
...全文
311 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
首先感谢您的回复,我进行了修改,用memcpy实现赋值,但是多行依然很慢,并且单列、多列赋值根本 不能用memcpy实现赋值,我做的是BM3D相似快查找,大量的数据。如果用我写的方法,需要用一个下午的时间来运行程序,虽然证明结果是正确的。看看您有没有办法改进效率!谢谢 ////////////////////////////////////////////////////////////////////// // //用户来实现A(a,:)=B(b,:) // // // 返回值:无 ////////////////////////////////////////////////////////////////////// void CMatrix::fuhangzhi(int a,CMatrix B,int b) { memcpy(m_pData+(a-1)*m_nNumColumns,B.m_pData+(b-1)*B.m_nNumColumns, sizeof(double)*m_nNumColumns); } ////////////////////////////////////////////////////////////////////// // //A=B(C,) // // // 返回值:无 ////////////////////////////////////////////////////////////////////// void CMatrix::fuduohangzhi(CMatrix B,CMatrix C) { int m; for(int i=0;i<C.GetNumRows();i++) { m=C.GetElement(i,0); fuhangzhi(i+1,B,m); } }
ivandark 2013-04-30
  • 打赏
  • 举报
回复
赋值一般都是这样的,只不过在处理大图像时可以通过别的方法,比如建立金字塔什么的减小运算量

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧