R 将向量的每个分量乘以另一个向量(得到长度为m*n的向量)

R 将向量的每个分量乘以另一个向量(得到长度为m*n的向量),r,R,假设我制造的零件有三种尺寸,每种尺寸都有一定的公差: target <- c(2, 4, 6) tolerance <- c(0.95, 1.05) 这是一个非常丑陋的方法,但我知道有一个简单的方法来做到这一点 j<-1 tol<-NULL for (i in target){ tol[j] <- i*tolerance[1] tol[j+1] <- i*tolerance[2] j<-j+2 } j使用矩阵积可以实现: target <- c

假设我制造的零件有三种尺寸,每种尺寸都有一定的公差:

target <- c(2, 4, 6)
tolerance <- c(0.95, 1.05)
这是一个非常丑陋的方法,但我知道有一个简单的方法来做到这一点

j<-1
tol<-NULL
for (i in target){
tol[j] <- i*tolerance[1]
tol[j+1] <- i*tolerance[2]
j<-j+2
}

j使用矩阵积可以实现:

target <- c(2, 4, 6)
tolerance <- c(0.95, 1.05)
target %*% t(tolerance)
     [,1] [,2]
[1,]  1.9  2.1
[2,]  3.8  4.2
[3,]  5.7  6.3

target向量
tol
可以使用
outer()
这样计算:

tol <- c(outer(tolerance,target))
#> tol
#[1] 1.9 2.1 3.8 4.2 5.7 6.3
tol
#[1] 1.9 2.1 3.8 4.2 5.7 6.3

另一个答案我更喜欢,但在某些特定情况下(两个以上的向量),这个替代方法可能会推广得更好


主要是为了好玩-使用R的回收:

rep(target, each = length(tolerance)) * tolerance
#[1] 1.9 2.1 3.8 4.2 5.7 6.3

虽然
outer
对于产品之外的其他功能很有用,但值得注意的是,它所做的只是一些额外的检查,然后在
FUN
参数为missing@eddi用数学术语来说,你的评论是错误的。请了解并矢(外)积和矩阵乘法之间的区别
%*%
。这是一个例外情况,矩阵乘积只会导致相同的结果,因为“矩阵”是秩(1,m)和(n,1)。在这种情况下,矩阵乘积%*%执行不必要的求和。OP描述的情况是使用外部产品或
%o%
,而不是
%*%
的标准示例。在R中实现这些不同的产品是不同的。如果使用向量而不是矩阵作为输入,那么矩阵积可以用同样的方法处理。好的,我不反对任何一种说法。。你还想谈谈与这个问题相关的其他事情吗?让我澄清一下我的说法——如果你看一下源代码,你会发现这个答案所做的一切,就是在
v1%*%t(v2)
周围添加绒毛。这确实提供了我想要的,但是我希望结果存储在向量中。我将向量传递到一个面包络图上的
geom_vline
,其中我将传递的data.frame是
data.frame(tol,rep(as.factor(target),each=2))
,这样3个子图中的每个都有上下公差。
Reduce("*", expand.grid(list(tolerance, target)))
rep(target, each = length(tolerance)) * tolerance
#[1] 1.9 2.1 3.8 4.2 5.7 6.3