первого, немного фона к моей проблеме:Накопительных голоса в MATLAB
Я строй системы распознавания объектов с помощью геометрической техники хэширования. Моя хеш-таблица индексируется аффинными координатами точек в модели, определенной базисным триплетом (позволяющим аффинно-инвариантное представление любого научного объекта). Каждая запись хэш-таблица представляет собой структуру:
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
Это, безусловно, не самый эффективный способ. Сразу же я вижу, что было бы более эффективно инициализировать массивы для хранения голосов заблаговременно. Однако, однако, есть ли лучший способ в этом? Мне нужно попытаться найти наиболее эффективный и элегантный способ голосования, поскольку, как правило, сотни очков проверяются, и время ценно.
Благодаря
Чтобы получить полные ответы, я думаю, вам понадобится создать некоторые данные примера, чтобы код-блок был запущен. Слишком много взаимосвязанных структур поглощать, глядя на код. Но в качестве общего комментария подумайте о замене строки 'ModelName' на число, которое индексирует массив ячеек ModelNames. – Peter