2013-10-04 6 views
1

первого, немного фона к моей проблеме:Накопительных голоса в 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 

Это, безусловно, не самый эффективный способ. Сразу же я вижу, что было бы более эффективно инициализировать массивы для хранения голосов заблаговременно. Однако, однако, есть ли лучший способ в этом? Мне нужно попытаться найти наиболее эффективный и элегантный способ голосования, поскольку, как правило, сотни очков проверяются, и время ценно.

Благодаря

+0

Чтобы получить полные ответы, я думаю, вам понадобится создать некоторые данные примера, чтобы код-блок был запущен. Слишком много взаимосвязанных структур поглощать, глядя на код. Но в качестве общего комментария подумайте о замене строки 'ModelName' на число, которое индексирует массив ячеек ModelNames. – Peter

ответ

0

Если вы только с учетом эффективности времени, рассмотреть возможность использования 4d матрицы.

размеры будут:

  • Модель
  • coordinateA
  • coordinateB
  • coordinateC

В зависимости от соотношения между этой матрицей размером и количеством точек, которые вы проверить , рассмотрим использование разреженной матрицы.

Обратите внимание, что, особенно если вы не можете использовать разреженный массив, этот метод может быть скорее неэффективным и, следовательно, может быть неосуществимым.

Смежные вопросы