#r #matrix #vector #multiplication
#r #матрица #вектор #умножение
Вопрос:
У меня есть вектор a и матрица A
a = c(2,5,6)
b=cbind(c(2,7,0),c(3,0,11),c(99,0,0))
A = as.matrix(b)
Я хочу умножить a на матрицу A и получить в качестве результата вектор, который подсчитывает количество операций без нулей.Для этого примера ответ должен быть :
2*2 5*7 6*0 (there are two operations without 0.So the answer is 2)
2*3 5*0 6*11 (there are two operations without 0.So the answer is 2)
2*99 5*0 6*0 (there is one operation without 0.So the answer is 1)
THe answer should be (2,2,1)
Как мне решить эту проблему?
Ответ №1:
Вы можете сделать что-то вроде этого
> rowSums((t(A) * a) !=0)
[1] 2 2 1
Ответ №2:
Мы умножаем ‘A’ на ‘a’, преобразуем его в логическое matrix
, сравнивая, не равны ли значения 0, и получаем суммы столбцов логических столбцов
colSums((A * a) != 0)
#[1] 2 2 1
Обратите внимание, что
A * a
# [,1] [,2] [,3]
#[1,] 4 6 198
#[2,] 35 0 0
#[3,] 0 66 0
и
t(A) * a
# [,1] [,2] [,3]
#[1,] 4 14 0
#[2,] 15 0 55
#[3,] 594 0 0
Значения в сообщении OP
2*2 5*7 6*0
соответствует A * a
На основе примера, поскольку в ‘a’ нет нулевых элементов
colSums(A != 0)
#[1] 2 2 1
или с помощью apply
apply(A, 2, FUN = function(x) sum((x * a) != 0))
#[1] 2 2 1
Ответ №3:
Большое вам спасибо за ваши ответы. Я пытался работать с vector также с нулевыми значениями:
d= c(0,2,4,6)
b=cbind(c(2,7,0,7),c(3,0,11,9),c(99,0,0,2),c(9,0,0,2))
B= as.matrix(b)
Затем я многократно преобразую вектор d в матрицу B
d * B
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 14 0 0 0
[3,] 0 44 0 0
[4,] 42 54 12 12
последнее — суммировать числа столбцов без 0:
colSums((d*B) !=0)
ПРИБЫЛЬ!
окончательный код:
d= c(0,2,4,6)
b=cbind(c(2,7,0,7),c(3,0,11,9),c(99,0,0,2),c(9,0,0,2))
B= as.matrix(b)
colSums((d*B) !=0)