Оптимизация сравнения матриц по строкам в R

#r #matrix

#r #матрица

Вопрос:

Я много гуглил и, похоже, не могу найти ответа на свою проблему. Прошу прощения, если об этом спрашивали раньше. У меня есть две матрицы, a и b, каждая с одинаковыми размерами. То, что я пытаюсь сделать, это выполнить итерацию по строкам a (от i = 1 до количества строк в a) и проверить, появляются ли какие-либо элементы, найденные в строке i матрицы a, в соответствующей строке матрицы b. У меня есть решение с использованием sapply, но это становится довольно медленным с очень большими матрицами. Я задавался вопросом, можно ли как-то векторизовать мое решение? Примеры ниже:

 # create example matrices
a = matrix(
  1:9,
  nrow = 3
)

b = matrix(
  4:12,
  nrow = 3
)

# iterate over rows in a....
# returns TRUE for each row of a where any element in ith row is found in the corresponding row i of matrix b
sapply(1:nrow(a), function(x){ any(a[x,] %in% b[x,])})

# however, for large matrices this performs quite poorly. is it possible to vectorise?

a = matrix(
  runif(14000000),
  nrow = 7000000
)

b = matrix(
  runif(14000000),
  nrow = 7000000
)

system.time({
 sapply(1:nrow(a), function(x){ any(a[x,] %in% b[x,])})
})


 

Ответ №1:

Используйте apply, чтобы найти любые 0 различий:

 a <- sample(1:3, 9, replace = TRUE)
b <- sample(1:3, 9, replace = TRUE)
a <- matrix(a, ncol = 3)
b <- matrix(b, ncol = 3)

diff <- (a - b)
apply(diff, 1, function(x) which(x == 0)) # actual indexes = 0
apply(diff, 1, function(x) any(x == 0)) # row check only
 

или

Ответ №2:

Может быть, вы можете попробовать intersect asplit , как показано ниже

 lengths(Map(intersect, asplit(a, 1), asplit(b, 1))) > 0