如何在Matlab中将这个嵌套的for循环更改为矢量化形式?
for i = 1 : Ix - (Iy-1)
for j = 1 : Jx - (Jy-1)
diff = x_im(i:i+(Iy-1), j:j+(Jy-1), : ) - y_im;
if ( sum ( abs ( diff(:)) ) == 0 )
return;
end
end
end
答案 0 :(得分:0)
所以这不是很好,但是这里有一个解决方案(我只是坚持使用x和y):
f = @(i,j) nnz(x(i:i+Iy-1, j:j+Jy-1, :) - y)
[idx, jdx] = ind2sub( [(Ix - (Iy-1)), ( Jx - (Jy-1))], 1:(Ix - (Iy-1))*( Jx - (Jy-1)))
result = any(any(~arrayfun(f,idx,jdx)));
所以你正在寻找矩阵y的实例,嵌入矩阵x,对吧?第一行定义了一个匿名函数,它执行从x的特定子数组中减去y的原子操作。第二行构建一组与您要执行的所有减法相对应的索引。最后一行将匿名函数(用于减法)应用于第二行的虚拟索引。如果result == 1,则x内至少出现一次y。如果result == 0,则没有。如果您想知道x中出现y的位置(原始代码没有这样做),请将最后一行更改为
result = ~arrayfun(f,idx,jdx);
并查找数组中的任何1
。 1
的(i,j)索引为您提供x中相应子阵列的左上角。