【发布时间】:2013-09-20 18:42:44
【问题描述】:
我正在寻找一种在更大矩阵(任意维数)中找到矩阵(模式)的“好”方法。
例子:
total = rand(3,4,5);
sub = total(2:3,1:3,3:4);
现在我希望这发生:
loc = matrixFind(total, sub)
在这种情况下,loc 应该变为 [2 1 3]。
现在我只对找到一个点(如果存在)感兴趣,并不担心舍入问题。可以假设sub“适合”total。
这是我如何在 3 个维度上做到这一点,但感觉好像有更好的方法:
total = rand(3,4,5);
sub = total(2:3,1:3,3:4);
loc = [];
for x = 1:size(total,1)-size(sub,1)+1
for y = 1:size(total,2)-size(sub,2)+1
for z = 1:size(total,3)-size(sub,3)+1
block = total(x:x+size(sub,1)-1,y:y+size(sub,2)-1,z:z+size(sub,3)-1);
if isequal(sub,block)
loc = [x y z]
end
end
end
end
我希望为任意数量的维度找到一个可行的解决方案。
【问题讨论】:
-
不确定它是否有助于解决问题,但可以将
ndims(sub)假定为等于ndims(total)吗? -
请注意:对于仅二维的情况,Matlab File Exchange 中的函数
findsubmat有很好的实现思路(和代码 cmets)。 -
与@ojdo 的第一个问题有点相关:我认为你必须更精确地定义你想要的输出,以防
ndim(sub) < ndims(total)。我想在这种情况下,您的 for 循环可能找不到所有可能的解决方案。要求ndims(sub) == ndims(total)可能会简化一些事情。 -
@BasSwinckels 如果我尝试
sub = total(2,1,3)似乎没问题。ndims(sub)是 2,ndims(total)是 3。即使维度是单例,定义size(sub,3)也会有所帮助。无论哪种方式,我的代码中都可能存在错误,但我希望目标很明确:我只希望它在subs'fits' intotal时工作。 -
@DennisJaheruddin 一个问题是 Matlab 没有实现真正的 N 维数组,而是做了一些奇怪的事情:它省略了尾随单维数(
size(zeros(3,2,1)) == [3,2],而size(zeros(1,2,3)) == [1,2,3])和标量始终是二维的 (size(1) == [1,1])。但我的主要问题是与哪个维度进行比较,以防sub的维度小于total。