1

首先,我的问题的一些背景:

我正在使用几何散列技术构建对象识别系统。我的哈希表由模型中点的仿射坐标索引,该模型由基三元组确定(允许任何学习对象的仿射不变表示)。每个哈希表条目都是一个结构:

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 维索引。我确实在单元阵列中也有这些基本三元组,但是我很难在这个单元阵列中搜索二维阵列。myIsEqual 函数只是搜索第三维并检查每个索引处的二维数组是否相等,返回一个数组相等的一维向量以用于查找。

function ind = myIsEqual(vec3D, A)

    ind = zeros(size(vec3D, 3), 1);
    for i = 1:size(vec3D, 3)
        ind(i) = isequal(vec3D(:, :, i), A);
    end

这肯定不是最有效的方法。我立即可以看到,预先初始化数组以存储投票会更有效。但是,一般来说有没有更好的方法来解决这个问题?我需要尝试找到最有效和最优雅的投票方式,因为通常需要检查数百个点,而且时间很宝贵。

谢谢

4

1 回答 1

0

如果您只考虑时间效率,请考虑使用 4d 矩阵。

尺寸将是:

  • 模型
  • 坐标A
  • 坐标B
  • 坐标C

根据此矩阵大小与您检查的点数之间的比率,考虑使用稀疏矩阵。

请注意,特别是如果您不能使用稀疏数组,则此方法可能会导致内存效率低下,因此可能不可行。

于 2013-10-04T13:03:21.310 回答