首先,我的问题的一些背景:
我正在使用几何哈希技术构建一个对象识别系统。我的哈希表由由基三元组确定的模型中点的仿射坐标索引(允许任何学习对象的仿射不变表示(。每个哈希表条目都是一个结构:
entry = struct('ModelName', modelName, 'BasisTriplet', [a; b; c])];
现在,从图像点中提取任意基三元组,然后相对于该基计算所有其他点的仿射坐标,并用作哈希表的索引。对于此哈希箱中存在的每个条目,将对模型名称和基础三元组进行投票。检查所有点后,将具有足够高票数的模型及其相应的基三元组作为对象的候选,并执行进一步的验证步骤。
然而,我不确定投票的最有效方法是什么。目前我使用的是动态单元格数组,每次投票支持新模型和基础三元组对时,都会向数组添加一行。否则,现有候选人的票数将递增。
for keylist = 1:length(keylist)
% Where keylist is an array of indicies to the relevant keys to look up
% xkeys is the n by 2 array of all of the keys in the hash table
% Obtain this hash bin
bin = hashTable(xkeys(keylist(i), 1), xkeys(keylist(i), 2));
% Vote for every entry in the bin
for entry = 1:length(bin)
% Find the index of this model/basis in the voting accumulator
indAcc = find( strcmp(bin.ModelName, v_models(:, 1)) & myIsEqual(v_basisTriplets, bin.BasisTriplet) );
if isempty(indAcc)
% If entries do not exist yet, Add new entries
v_models = [v_models; {bin.ModelName, 1}];
v_basisTriplets = cat(3, v_basisTriplets, bin.BasisTriplet);
else
% Otherwise increment the count
v_models(indAcc, 2) = v_models(indAcc, 2)+1;
end
end
end
有一个单独的 3D 数组 (v_basisTriplets(,其中 2D 基础数组沿第 3 维连接和索引。我在单元格阵列中也有这些基础三元组,但是我很难在这个单元格阵列中搜索 2D 数组。myIsEqual 函数只是搜索第三维并检查每个索引处的 2D 数组是否相等,返回一个 1D 向量,其中数组相等以用于查找。
function ind = myIsEqual(vec3D, A)
ind = zeros(size(vec3D, 3), 1);
for i = 1:size(vec3D, 3)
ind(i) = isequal(vec3D(:, :, i), A);
end
这肯定不是最有效的方法。我立即可以看到,事先初始化数组以存储选票会更有效。但是,一般来说有更好的方法来解决这个问题吗?我需要尝试找到最有效和最优雅的投票方式,因为通常有数百个点需要检查,时间很宝贵。
谢谢
如果您只考虑时间效率,请考虑使用 4D 矩阵。
尺寸为:
- 型
- 坐标A
- 坐标B
- 坐标C
根据此矩阵大小与检查的点数之间的比率,请考虑使用稀疏矩阵。
请注意,特别是如果您不能使用稀疏数组,此方法的内存效率可能相当低下,因此可能不可行。