【发布时间】:2019-09-06 13:27:22
【问题描述】:
以下函数将在加载的图像上随机“撒盐”。为了提高性能,条件语句
uint j = rows == 1 ? 0 : randomRow(generator);
不应在循环内。
相反,我想在循环之前将 lambda getJ 定义为
auto getJ = rows == 1 ? []() {return 0; } : []() {return randomRow(generator); };
但是,我使用此 lambda 的代码无法使用以下红色波浪状文本进行编译:
问题
如何有条件地定义这样一个 lambda?
void salt_(Mat mat, unsigned long long n)
{
const uchar channels = mat.channels();
uint cols = mat.cols;
uint rows = mat.rows;
if (mat.isContinuous())
{
cols *= rows;
rows = 1;
}
default_random_engine generator;
uniform_int_distribution<uint> randomRow(0, rows - 1);
uniform_int_distribution<uint> randomCol(0, cols - 1);
// auto getJ = rows == 1 ? []() {return 0; } : []() {return randomRow(generator); };
uchar * const data = mat.data;
for (unsigned long long counter = 0; counter < n; counter++)
{
uint i = randomCol(generator);
uint j = rows == 1 ? 0 : randomRow(generator);
//uint j = getJ();
uint index = channels * (cols * j + i);
for (uchar k = 0; k < channels; k++)
data[index + k] = 255;
}
}
【问题讨论】:
-
“我的 lambda 代码无法编译” - 你得到什么错误?
-
您试图引用局部变量
generator而不捕获它。如果第二个 lambda 是无捕获的,它将编译。 -
似乎是过早的优化。函数调用开销肯定会大于三元开销吗?
-
有条件的真的是性能问题吗?你分析过代码吗?
-
@Artyer 做得好,可以内联对 lambda 的调用。
标签: c++