Подсчет операций без нулевых значений при умножении матриц в r - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть вектор А и матрица А

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)

Как мне решить эту проблему?

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Вы можете сделать что-то вроде этого

>  rowSums((t(A) * a)  !=0)
[1] 2 2 1
0 голосов
/ 12 апреля 2019

Большое спасибо за ваши ответы. Я пытался работать с вектором также с нулями:

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)

PROFIT! окончательный код:

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)
0 голосов
/ 12 апреля 2019

Мы умножаем '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

Значения в посте ОП

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
...