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