【发布时间】:2014-03-12 14:33:43
【问题描述】:
我有一个 Nx2 数组 K1 与 N 个关键点的位置和一个 3 维 WxHx3 数组 Kart1(width,height,coordinates) 将坐标映射到图像的每个像素。对于K1 中的每个关键点,我想读取Kart1 中像素的位置,并在其周围的 3x3 内核中评估坐标(搜索最小值/最大值或计算平均值)并为当前像素赋值在KPCoor1。
我目前的做法是这样的:
for ii=1:length(K1(:,1)) %for every keypoint in K1
MinDist=sqrt(sum(Kart1(K1(ii,2)-1,K1(ii,1)-1,:).^2)); %Calculate distance
xShift=0;
yShift=0;
for kk=-1:1 %for every pixel in a 3x3 kernel...
for ll=-1:1
Distance=sqrt(sum(Kart1(K1(ii,2)+kk,K1(ii,1)+ll,:).^2));
if Distance<MinDist %... if the current distance is smaller than MinDist
MinDist=Distance; %... update MinDist...
xShift=kk; %... and take the kernel coordinate of the pixel
yShift=ll;
end
end
end
KP1Coor(ii,:)=Kart1(K1(ii,2)+xShift,K1(ii,1)+yShift,:); %assign the coordinates of the pixel with the minimal distance in kernel.
end
它可以运行,但是很丑,我怀疑它是否在做我想做的事情。我对此事的“多维性”感到有些困惑,不知道评估内核的许多函数,并且想不出使用诸如bsxfun() 或逻辑运算之类的矢量化函数的方法(意味着我被卡住了我的大脑很干:/)
关于如何消除这些循环/更正代码的任何建议?
【问题讨论】:
-
我认为您需要在第一个嵌套循环中使用
xShift=-1和yShift=-1,您不觉得吗?另外,你需要MinDist作为输出吗? -
在这种情况下,我对最小距离的“位置”更感兴趣,我从 x 和 y 的变化中读出了这一点。这就是我使用它们的目的。 PS:我以更优雅的方式完全解决了这个问题,仍然感谢您对一个老问题的评论!
-
好吧,我仍然继续使用基于
bsxfun的自己的解决方案!你说你已经实现了它的一个高效版本,我想我不会介意showdown of benchmarks反对这里介绍的版本,如果你也愿意:) 如果你这样做,也许你可以编辑你的问题它或在这里制作自己的解决方案,尽管我认为后一个会很好。 -
我的意思是我不再需要寻找那个了,但请放心,到目前为止,您的回答会赢得摊牌! ;)
标签: matlab multidimensional-array vectorization lookup bsxfun