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