#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