Могу ли я умножить векторы разной длины?
v1 <- c(1,2)
v2 <- c(3,4,5,6)
Есть ли способ умножить эти два вектора так, чтобы в результате получился вектор dim(1,3)
такие как (11,14,17)
Это аналогично всем возможным комбинациям умножения dim(1,2), таким как(1,2) %x% t(3,4)
, (1,2) %x% t(4,5)
, (1,2) %x% t(5,6)
Вроде все так просто, посмотрели и не повезло.
4 ответа
Создайте 2-рядную матрицу:
> rbind(v2[-length(v2)],v2[-1])
[,1] [,2] [,3]
[1,] 3 4 5
[2,] 4 5 6
Тогда это просто матрица мульти:
> v1 %*% rbind(v2[-length(v2)],v2[-1])
[,1] [,2] [,3]
[1,] 11 14 17
и подмножество, если вы хотите вектор:
> (v1 %*% rbind(v2[-length(v2)],v2[-1]))[1,]
[1] 11 14 17
Используйте подмножество и cbind
чтобы создать матрицу ваших комбинаций, затем примените ее к строкам с умножением.
apply(cbind(v2[-length(v2)],v2[-1]),1,function(x) v1%*%x)
[1] 11 14 17
Похоже на ответ Джеймса, но может быть проще:
sapply(1:(length(v2)-1), function(j) sum(v1*v2[j:j+1]))
Так как вы умножаете только векторы (то есть матрицы размером 1 на N:-)), вам не нужно погружаться в операции с матрицами.
Другой вариант:
na.omit(filter(v2, rev(v1)))
Вы также можете использовать embed
:
apply(embed(v2, 2), 1, FUN='%*%', rev(v1))