首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非常慢的matlab jacket if语句

非常慢的matlab jacket if语句
EN

Stack Overflow用户
提问于 2012-08-07 01:51:46
回答 2查看 933关注 0票数 0

在matlab中使用cuda\jacket时,我遇到了一个非常慢的if语句响应。(使用简单的for循环和if条件,查找本地最大值的代码分别为5秒和0.02秒)

作为图形处理器编程的新手,我去阅读,当我看到之前的matlab if statements with CUDA SO讨论时,我觉得缺少了一些东西。你不需要使用cuda就能知道向量化你的代码更好。但是,在某些情况下,无论如何都需要使用if语句。例如,我想找出2D图像的一个像素(比如m(a,b))是否是它的8个最近邻域中的局部最大值。在matlab中,一种简单的方法是对if语句使用8个逻辑条件:

如果m(a,b)>m(a-1,b-1) & m(a,b)>(a,b-1) & m(a,b)>(a+1,b-1) &…在所有最近的邻居上等等

如果你有一个解决(或矢量化)这个问题的想法,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-08 04:03:19

使用多个"if“语句(或任何其他条件语句)的问题是,对于每个语句,结果会从gpu复制到主机,这可能是代价高昂的。

最简单的方法是按以下方式进行矢量化。

代码语言:javascript
复制
window = m(a-1:a+1, b-1:b+1);
if all(window(:) <= m(a,b))
% do something
end

如果您可以显示if / else条件正在做什么,则可以进一步优化这一点。也就是说,请发布if/else代码,看看是否有其他优化可用(即,查看可能的方法来完全删除if条件)。

编辑

有了新的信息,以下是可以做的事情。

代码语言:javascript
复制
for j = 1:length(y)
 a = x(j);
 b = y(j);
 window = d(a-1:a+1, b-1:b+1);
 condition = all(window(:) <= d(a,b));
 M(a, b) = condition + ~condition * M(a,b);
end

你可以使用gfor循环来让它更快。

代码语言:javascript
复制
gfor j = 1:length(y)
 a = x(j);
 b = y(j);
 window = d(a-1:a+1, b-1:b+1);
 condition = all(window(:) <= d(a,b));
 M(a, b) = condition + ~condition * M(a,b);
gend
票数 2
EN

Stack Overflow用户

发布于 2012-08-07 02:11:49

使用内置函数的

已经优化的最简单的方法可能是使用imregionalmax函数,

代码语言:javascript
复制
maxinI = imregionalmax(I, CONN); 

其中CONN是所需的连接性(在本例中为8)。

但是请注意,imregionalmax是图像处理工具箱的一部分。

使用 max function

如果您尝试查看这一个像素是否为其邻居的局部最大值,您可能会这样做

代码语言:javascript
复制
if  m(a,b) == max(max(m( (a-1) : (a+1), (b-1) : (b+1))))

或者也许不需要两个max,在某些情况下重塑可能会更快,

代码语言:javascript
复制
if  m(a,b) == max(reshape (m( (a-1) : (a+1), (b-1) : (b+1)), 9,1)  )

不带 max function

最后,如果您希望完全避免使用max函数,也可以使用比目前更矢量化的形式,即

代码语言:javascript
复制
if  all(reshape( m(a,b) >= m( (a-1) : (a+1), (b-1) : (b+1)), 9,1))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11833349

复制
相关文章

相似问题

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