首先,我的问题有一点背景:
我正在使用几何散列技术构建对象识别系统。我的哈希表由基础三元组确定的模型中的点的仿射坐标索引(允许任何学习对象的仿射不变表示)。每个哈希表条目都是一个结构:
entry = struct('ModelName', modelName, 'BasisTriplet', [a; b; c])];
现在,从图像点提取任意基础三元组,然后相对于该基础计算所有其他点的仿射坐标,并将其用作哈希表的索引。对于此哈希箱中存在的每个条目,将对modelName和基础三元组进行投票。 在检查所有点之后,将具有足够高票数的模型及其相应的基础三元组作为对象的候选者,并且执行进一步的验证步骤。
但我不确定投票的最有效方法是什么。目前我正在使用动态单元阵列,每次投票选择新模型和基础三元组时,都会在阵列中添加一行。否则,现有候选人的投票数会增加。
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
这肯定不是最有效的方式。我立刻就会发现,初始化数组以预先存储投票会更有效率。然而,总的来说,有更好的方法来解决这个问题吗?我需要尝试找到最有效和最优雅的投票方式,因为通常需要检查数百个点,时间才有价值。
由于
答案 0 :(得分:0)
如果您只考虑时间效率,请考虑使用4d矩阵。
尺寸为:
根据此矩阵大小与您检查的点数之间的比率,请考虑使用稀疏矩阵。
请注意,特别是如果你不能使用稀疏数组,这种方法可能是内存效率低下的,因此可能是不可行的。