Могу ли я умножить векторы разной длины?

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))
Другие вопросы по тегам