Я предполагаю (для a12
), что вы хотите сделать следующее. У вас есть два вектора x
(длины m
) и y
, и для каждого элемента x[i]
из x
вы рассчитываете число различных
индексные пары j1
, j2
из y
такие, что x[i]
превосходит y[j1]
и y[j2]
, и затем вы суммируете это количество по всем i
.
Вот быстрый способ сделать a12
(другой будет оставлен в качестве упражнения). Сначала обратите внимание, что вы можете перевернуть порядок суммирования:
a12 = Sum_(j1 < j2) Sum_(i=1:m) I( X[i] > Y[j1] & X[i] > Y[j2] ),
т.е. для каждой отдельной пары индексов j1,j2
мы вычисляем количество элементов x
, которые превышают как y[j1]
, так и y[j2]
, а затем суммируем эту величину по всем этим отдельным парам индексов. Теперь вычисление внутренней суммы для пар j1,j2
похоже на умножение матриц. Действительно, предположим, что мы определяем векторы x
и y
:
set.seed(1)
x <- sample(1:5,5,T)
y <- sample(1:5,10,T)
тогда мы можем использовать функцию outer
для получения матрицы y_x
, чья запись [i,j]
равна TRUE, если и только если y[i] < x[j]
:
y_x <- outer(y,x,FUN = '<')
Теперь мы получаем внутренние суммы, выполняя
z <- y_x %*% t(y_x)
, где z[i,j]
- количество элементов x
, которое превышает как y[i]
, так и y[j]
. Поскольку мы хотим суммировать z[i,j]
только для различных i < j
, мы получаем конечный результат, взяв сумму нижнего треугольника z
, используя
a12 <- sum( z[lower.tri( z )])
> a12
[1] 72