matlab-mex-c++:在 for 循环中,为数组分配非常量值很慢
matlab-mex-c++: in a for loop, It's slow to assign a non-constant value to an array
我尝试使用matlab mex(c++)来优化我的matlab程序。问题是给数组赋值(不是常量)非常慢。我自己找不到答案。
背景:
c++源代码如下:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{ ...
int row_num = 6000, col_num=4000;
int total_sim_num=row_num*row_num, total_rate_num=row_num*col_num;
plhs[0] = mxCreateNumericMatrix(row_num, row_num, mxSINGLE_CLASS, mxREAL);
//plhs[0] is the pointer of output matrix, and, indeed, it's an 1-D vector.
//Matlab code can use it as 2-D matrix.
float* out_mat = (float*)mxGetData(plhs[0]);
//later, I want to write the calculated value to matrix: out_mat
这是一个3层循环,输出矩阵很大:a_OUT=row_num*row_num
结果取决于一些输入矩阵:A_IN=row_num*col_num。
for(int u=0; u<row_num; u++)
{
for(int v=u, vx=0; v<total_sim_num; v+=row_num, vx++)
{
for (int i=u, ix=vx; i<total_rate_num; i+=row_num, ix+=row_num)
{
float calculated_value = ix/row_num; //it's fast.
out_mat[v] = calculated_value; //It's very slow (~ 10 minutes)
//out_mat[v] -> A_OUT[u][v]
out_mat[v] = 2; //assign constant, it's fast (< 2 seconds)
}
}
}
如评论中所述:
- 将常量指定给out_mat是快速的
- 将计算值分配给局部变量很快
- 为out_mat指定计算值的速度非常慢
我也试过这个:
float* testv = new float[total_sim_num];
然后:
testv[v] = calculated_value; //It's very slow too.
有人能分享为什么在为out_mat指定计算值时速度如此缓慢的原因吗?是否可以像为out_mat指定常量一样快?
非常感谢!
Jun
在写入out_mat
时,使用多个不同值(在第三级循环中按顺序计算)覆盖同一数组元素(out_mat[v]
,其中v
是第二级for
-循环的控制变量)。
所以,当你只给数组分配常量时,编译器可能会优化对第二级循环的分配,也可能会完全优化掉第三级循环。
你确定你粘贴在这里的代码是对的吗?
MATLAB矩阵按列顺序存储。您正在创建的mxArray
是row_num x row_num
,可能应该是row_num x col_num
。
然后,您应该使用i + (j-1)*row_num
对out_mat
数组进行索引,以访问i
行和j
列。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- OpenGL大的3D纹理(>2GB)非常慢
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 分配空间时,我会收到非常不同的地址
- C++在堆上分配相同类型的变量所花费的时间非常不同
- matlab-mex-c++:在 for 循环中,为数组分配非常量值很慢
- 内存分配/释放错误(非常小的代码)
- 你能用 c 或 c++ 分配一个非常大的单块内存(> 4GB)吗?