[英]MVM with a numeric vector (not a matrix vector) and how to avoid double transposition?
I have the following simplified case which is actually a much bigger performance hotspot:我有以下简化案例,它实际上是一个更大的性能热点:
epsilon <- c(-3, -4)
str(epsilon)
num [1:2] -3 -4
Q <- matrix(c(2, 1, 0, 3, 1, 0), nrow=3, ncol=2)
str(Q)
num [1:3, 1:2] 2 1 0 3 1 0
Q
[,1] [,2]
[1,] 2 3
[2,] 1 1
[3,] 0 0
This is the correct result I need but it requires double-transposition ie expensive for large Qs:这是我需要的正确结果,但它需要双转位,即对于大 Q 来说很昂贵:
t(epsilon*t(Q))
[,1] [,2]
[1,] -6 -12
[2,] -3 -4
[3,] 0 0
However if I simply do the following I get different results (ie the second row is flipped):但是,如果我只是执行以下操作,则会得到不同的结果(即第二行被翻转):
Q*epsilon
[,1] [,2]
[1,] -6 -12
[2,] -4 -3
[3,] 0 0
Mathematically speaking (epsilon*Q^T)^T
should be the same as Q*epsilon^T
but that's not what I want (doing Q%*%epsilon
it would generate a 3x1 result).从数学上讲
(epsilon*Q^T)^T
应该与Q*epsilon^T
相同,但这不是我想要的(做Q%*%epsilon
它会产生 3x1 结果)。
Is there a way to achieve this without double transposing the potentially very large Q?有没有办法在不双重转置可能非常大的 Q 的情况下实现这一目标?
It would be easier to rep
licate with either col
providing the index of the columns of 'Q' so that both elements are of the same length这将是容易
rep
licate与任一col
提供的“Q”的列的索引,使得两个元件是相同的长度的
Q * epsilon[col(Q)]
Or use rep
或者使用
rep
Q * rep(epsilon, each = nrow(Q))
Or with sweep
或者用
sweep
sweep(Q, 2, epsilon, `*`)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.