Подтвердить что ты не робот

Как я могу оптимизировать этот алгоритм индексирования

Мои вопросы

  • Есть ли способ ускорить этот расчет?
  • Есть ли лучший алгоритм или реализация, которые я могу использовать для вычисления тех же значений?

Описание алгоритма

У меня сложная проблема индексирования, которую я изо всех сил пытаюсь решить.

Цель состоит в вычислении матрицы w_prime с использованием значений комбинация значений из матриц одинакового размера w, dY и dX.

Значение w_prime(i,j) рассчитывается как mean( w( indY & indX ) ), где indY и indX - это индексы dY и dX, которые равны i и j соответственно.

Здесь простая реализация в matlab алгоритма для вычисления w_prime:

for i = 1:size(w_prime,1)
  indY = dY == i;
  for j = 1:size(w_prime,2)
    indX = dX == j; 
    w_prime(ind) = mean( w( indY & indX ) );
  end
end

Проблемы с производительностью

Эта реализация достаточна в примере ниже; однако в моем фактическом случае использования w, dY, dX равны ~ 3000x3000 и w_prime равно ~ 60X900. Это означает, что каждый расчет индекса происходит на ~ 9 миллионов элементов. Излишне использовать эту реализацию слишком медленно, чтобы ее можно было использовать. Кроме того, мне нужно будет запустить этот код несколько десятков раз.

Пример расчета

Если я хочу вычислить w(1,1)

  • Найти индексы dY, равные 1, сохранить как indY
  • Найти индексы dX, равные 1, сохранить как indX

enter image description here

  • Найти пересечение indY и indX сохранить как ind

enter image description here

  • Сохраните mean( w(ind) ) до w_prime(1,1)

enter image description here

Общая проблема Описание

У меня есть множество точек, определяемых двумя векторами X, и T, оба равны 1XN, где N равно ~ 3000. Кроме того, значения X и T являются целыми числами, связанными интервалами (1 60) и (1 900) соответственно.

Матрицы dX и dT являются просто матрицами расстояний, что означает, что они содержат попарные расстояния между точками. Ie dx(i,j) равно abs( x(i) - x(j) ).

Они вычисляются с использованием: dx = pdist(x);

Матрица w может рассматриваться как весовая матрица, которая описывает, какое влияние оказывает одна точка на другую.

Цель вычисления w_prime(a,b) - определить средний вес между подмножеством точек, разделенных a в измерении X и b в измерении T.

Это можно выразить следующим образом:

enter image description here

4b9b3361

Ответ 1

Это просто с ACCUMARRAY:

nx = max(dX(:));
ny = max(dY(:));

w_prime = accumarray([dX(:),dY(:)],w(:),[nx,ny],@mean,NaN)

Выход будет представлять собой массив размером nx -by- ny с NaN, где не было соответствующей пары индексов. Если вы уверены, что все время будет отображаться полный набор индексов, вы можете упростить приведенный выше расчет до

w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)

Итак, что делает резервуар? Он смотрит на строки [dX(:),dY(:)]. Каждая строка дает координатную пару (i,j) в w_prime, к которой добавляется строка. Для всех пар (1,1) он применяет функцию (@mean) к соответствующим записям в w(:) и записывает вывод в w_prime(1,1).