Мои вопросы
- Есть ли способ ускорить этот расчет?
- Есть ли лучший алгоритм или реализация, которые я могу использовать для вычисления тех же значений?
Описание алгоритма
У меня сложная проблема индексирования, которую я изо всех сил пытаюсь решить.
Цель состоит в вычислении матрицы 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

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

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

Общая проблема Описание
У меня есть множество точек, определяемых двумя векторами 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.
Это можно выразить следующим образом:
