Операции подсчета без нулевых значений при умножении матрицы в r

#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)