我需要在M(变量类型Mat)中分配值,值CV_32FC1(浮点),但是在10000x10000的大小下需要很长时间。 即:
for (i=0 ; i<rows; i++)
for (j=0 ; j<cols; j++){
...build variable NEW_VALUE for indexes i, j
M.at<float>(i,j) = NEW_VALUE
}
上面的代码需要 1 秒 aprox。我看到的另一种形式是定义联合(复制字节):
typedef union{float _float; uchar _uchar[4];} Bits;
...
Bits bits;
float new_value;
for (i=0 ; i<rows; i++)
for (j=0 ; j<cols; j+=4){
...//build variable new_value for indexes i, j
bits._float = new_value;
M.data[i*cols + j] = bits._uchar[0];
M.data[i*cols + j+1] = bits._uchar[1];
M.data[i*cols + j+2] = bits._uchar[3];
M.data[i*cols + j+3] = bits._uchar[3];
}
这比第一个要快得多。但不起作用。我尝试做:
memcpy(&M.data[i*cols + j], bits._uchar[0], 1);
memcpy(&M.data[i*cols + j+1], bits._uchar[1], 1);
...
但不起作用。
和:
memcpy(&M.at<float>(i,j), bits._uchar, 4);
也很慢。
我需要知道如何在 M 内正确复制new_value的字节
您的代码很慢,因为您要对每个像素执行大量计算。乘法运算不是一个便宜的操作,你可以多次使用它,无论是显式(i*cols + j)还是隐式(at
你可以做这样的事情:
float *prtM=(float*)M.data;
for (i=0 ; i<rows; i++)
for (j=0 ; j<cols; j++){
//...build variable NEW_VALUE for indexes i, j
*prtM = NEW_VALUE;
prtM++;
}
float* p;
for (i=0 ; i<rows; i++)
{
p = M.ptr<float>(i);
for (j=0 ; j<cols; j++)
{
*p++ = NEW_VALUE;
}
}
PAGHDV 的代码是优化最好的代码,但如果矩阵中的值不连续,则不起作用。