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;
}
...全文
358 2 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
赋值一般都是这样的,只不过在处理大图像时可以通过别的方法,比如建立金字塔什么的减小运算量
内容概要:本文研究了基于改进遗传算法的电力系统无功优化问题,选用IEEE 30节点标准系统作为仿真平台,通过Matlab代码实现算法设计与仿真分析。文中系统阐述了无功优化的数学建模过程,构建以降低有功网损和改善电压质量为目标的目标函数,并综合考虑节点电压、发电机无功出力、变压器变比及无功补偿容量等多种约束条件。针对传统遗传算法易陷入早熟收敛、搜索效率低的问题,引入改进策略以增强种群多样性、提升全局寻优能力和收敛速度。通过对IEEE 30节点系统的仿真验证,结果表明该改进算法能更有效地降低系统有功损耗、提高电压稳定性,展现出优越的优化性能和工程应用潜力。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力,从事电力系统运行与控制、智能优化算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于电力系统无功电压优化控制,提升电网运行的经济性与安全性;②为智能优化算法在复杂非线性工程问题中的改进与应用提供典型案例;③服务于高校教学实验、科研项目复现与算法性能对比分析。; 阅读建议:建议结合提供的Matlab代码进行同步学习,重点理解目标函数的构建逻辑、多重约束的处理技巧以及遗传算法的具体改进机制(如编码方式、选择、交叉、变异算子的改进),应在掌握标准遗传算法原理的基础上,深入剖析改进策略的设计思想,并尝试调整系统参数或引入其他优化算法进行对比实验,以深化理解和应用能力。
内容概要:本文研究了考虑电解槽变载启停特性与阶梯式碳交易机制的综合能源系统优化调度问题,通过构建包含电解槽动态运行特性的精细化数学模型,并引入阶梯式碳交易机制以体现碳排放成本的非线性增长特征,利用Matlab进行仿真与代码实现,旨在实现系统运行经济性与低碳性的协同优化。研究综合考虑了电、热、氢等多种能源形式的耦合关系及设备运行约束,采用优化算法求解多目标调度模型,有效提升了综合能源系统的能源利用效率与环境友好性,为含氢能环节的能源系统低碳调度提供了理论支持与技术路径。; 适合人群:具备电力系统、能源系统、优化建模或碳交易机制等相关背景的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究含电解制氢的综合能源系统低碳经济调度;②为考虑设备动态特性与市场化碳激励机制的能源系统提供优化决策方案;③支持学术科研成果复现、教学案例分析与仿真平台搭建。; 阅读建议:读者应结合Matlab代码与模型描述进行对照学习,重点关注电解槽启停动态建模方法与阶梯碳交易机制的数学表征,建议在仿真中调整关键参数以观察其对系统调度结果的影响,从而深入理解模型机理与优化逻辑。

19,466

社区成员

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

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