首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化C++嵌套-For循环

简化C++嵌套-For循环
EN

Stack Overflow用户
提问于 2021-12-27 11:04:14
回答 1查看 92关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
Mat src;
Mat dst;
Mat mean;
uchar tab[768];
for(i = 0; i< size.height; i++) {
    const uchar* sdata = src.ptr(i);
    const uchar* mdata = mean.ptr(i);
    uchar* ddata = dst.ptr(i);
    for(j = 0; j < size.width; j++) {
        ddata[j] = tab[sdata[j] - mdata[j] + 255];
    }
}

基本上,我试图计算选项卡的idx值,使用该idx获取选项卡中的值,然后将其分配给ddata

是否有更有效的方法来取得同样的结果?

EN

回答 1

Stack Overflow用户

发布于 2021-12-27 11:18:48

您可以利用以下事实:2维矩阵在内存中是一维的:

代码语言:javascript
复制
Mat src;
Mat dst;
Mat mean;
uchar tab[768];
const int maxI = size.width * size.height;
for(i = 0; i< maxI; i++) {
    dst.ptr(i) = tab[src.ptr(i) - mean.ptr(i) + 255];
}

在此基础上,您可以使用指针来避免从每个循环的索引中重新计算数据位置:

代码语言:javascript
复制
Mat src;
Mat dst;
Mat mean;
uchar tab[768];
const uchar* sdata = src.ptr(0);
const uchar* mdata = mean.ptr(0);
uchar* ddata = dst.ptr(0);
const int maxI = size.width * size.height;
for(i = 0; i< maxI; ++i) {
    *ddata++ = tab[*sdata++ - *mdata++ + 255];
}

注意:在第二个例子中,我将循环中的i++更改为++i,理论上这可能会更快,不过您应该在那里进行测量,看看这是否真的改变了什么。

而且,这段代码没有利用并行性。通过使用多线程使其运行得更快,您可以利用多个核心。这是另一个主题,如果您想走这条路线,这个this question有一些您可能会感兴趣的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70494632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档