r中的combn()函数
我试图对所有可能的向量组合执行点积。我能找到所有可能的组合。我只是不太明白combn()中有趣的论点是如何工作的。下面是我的代码,谢谢你的帮助r中的combn()函数,r,dot-product,combn,R,Dot Product,Combn,我试图对所有可能的向量组合执行点积。我能找到所有可能的组合。我只是不太明白combn()中有趣的论点是如何工作的。下面是我的代码,谢谢你的帮助 def=c("Normal.def","Fire.def","Water.def","Electric.def","Grass.def","Ice.def", "Fighting.def","Poison.def","Ground.def","Flying.def","Pyschic.def","Bug.def", "Rock
def=c("Normal.def","Fire.def","Water.def","Electric.def","Grass.def","Ice.def",
"Fighting.def","Poison.def","Ground.def","Flying.def","Pyschic.def","Bug.def",
"Rock.def","Ghost.def","Dragon.def","Null.def")
combn(def,2,FUN=def%*%def,simplify=TRUE)
你为什么不把整件事矩阵相乘呢。例如:
set.seed(1)
vec1 <- sample(1:10)
vec2 <- sample(1:10)
vec3 <- sample(1:10)
rbind(vec1, vec2, vec3) %*% cbind(vec1, vec2, vec3)
其中矩阵的每个单元格是列和列标签中两个向量的点积。或者,如果您确实想使用combn
:
vec.lst <- list(vec1, vec2, vec3)
combn(
seq_along(vec.lst), 2,
FUN=function(idx) c(vec.lst[[idx[[1]]]] %*% vec.lst[[idx[[2]]]])
)
注意这些数字是如何对应于矩阵的上三角形的。对于小数据集,矩阵乘法方法要快得多。对于大的,特别是向量非常大的,但是没有那么多,因为它不会运行那么多的计算(基本上只有上三角形)。为什么不将整个矩阵相乘呢。例如:
set.seed(1)
vec1 <- sample(1:10)
vec2 <- sample(1:10)
vec3 <- sample(1:10)
rbind(vec1, vec2, vec3) %*% cbind(vec1, vec2, vec3)
其中矩阵的每个单元格是列和列标签中两个向量的点积。或者,如果您确实想使用combn
:
vec.lst <- list(vec1, vec2, vec3)
combn(
seq_along(vec.lst), 2,
FUN=function(idx) c(vec.lst[[idx[[1]]]] %*% vec.lst[[idx[[2]]]])
)
注意这些数字是如何对应于矩阵的上三角形的。对于小数据集,矩阵乘法方法要快得多。对于大型的,尤其是向量非常大的,但没有那么多,因为
combn
方法不会运行那么多的计算(基本上只有上三角形)。使用@BrodieG的样本数据,您可以使用crossprod
函数:
set.seed(1)
vec1 <- sample(1:10)
vec2 <- sample(1:10)
vec3 <- sample(1:10)
crossprod(cbind(vec1, vec2, vec3))
# vec1 vec2 vec3
# vec1 385 298 284
# vec2 298 385 296
# vec3 284 296 385
set.seed(1)
vec1使用@BrodieG的样本数据,您可以使用crossprod
函数:
set.seed(1)
vec1 <- sample(1:10)
vec2 <- sample(1:10)
vec3 <- sample(1:10)
crossprod(cbind(vec1, vec2, vec3))
# vec1 vec2 vec3
# vec1 385 298 284
# vec2 298 385 296
# vec3 284 296 385
set.seed(1)
vec1你能发布一些你希望做的事情的输入和输出示例吗?有可能,combn
对于您的任务来说并不是最好的开始功能……您可以发布一些您希望执行的操作的示例输入和输出吗?有可能combn
并不是您任务开始时的最佳功能……我还没有找到combn
远程显示在顶部的示例数据crossprod
占据了第一位,但是您提出的cbind
/rbind
方法也很有效。我还没有找到combn
远程显示在顶部的示例数据crossprod
占据了第一位,但您提出的cbind
/rbind
方法也很有效。crossprod
似乎一直居于首位,但我能够以combn
的速度获得比t(mx)%*%mx
(其中mx==cbind(…)
)的三个向量各长1e6。我很惊讶crossprod
和t(mx)%*%mx
之间有这么大的区别,因为它们做的是相同的事情,后者几乎都是内部c代码;此外,转置只占两者差异的一小部分。实际上,从?crossprod
,正如您可能看到的:这在形式上等同于(但通常略快于)调用t(x)%*%y(crossprod)或x%*%t(y)(tcrossprod)。“但实际上差别很大。”布罗迪格,不幸的是,我不喜欢R中帮助页面的一点是没有时间表。虽然我们可能会增加软件包的版本号等等,但这并不意味着文档发生了变化,也不意味着所有功能都发生了变化。谁知道文档是什么时候或在什么条件下编写的,或者函数是什么时候(如果有的话)变得更快的。啊哈,crossprod(mx,mx)
的速度是crossprod(mx)
的两倍(至少在我引用的3列示例中)。当与t(mx)%*%mx
进行比较时,它们必须引用了第一个用例。但是,是的,我经常发现文档中缺乏细节令人恼火。有没有办法采用这种方法来做12个向量的点积,而不仅仅是2个向量的点积?crossprod
似乎一直排在首位,但我能够比t(mx)%*%mx
更快地获得combn
(其中mx==cbind(…)
)有三个向量,每个向量长度为1e6。我很惊讶crossprod
和t(mx)%*%mx
之间有这么大的区别,因为它们做的是相同的事情,后者几乎都是内部c代码;此外,转置只占两者差异的一小部分。实际上,从?crossprod
,正如您可能看到的:这在形式上等同于(但通常略快于)调用t(x)%*%y(crossprod)或x%*%t(y)(tcrossprod)。“但实际上差别很大。”布罗迪格,不幸的是,我不喜欢R中帮助页面的一点是没有时间表。虽然我们可能会增加软件包的版本号等等,但这并不意味着文档发生了变化,也不意味着所有功能都发生了变化。谁知道文档是什么时候或在什么条件下编写的,或者函数是什么时候(如果有的话)变得更快的。啊哈,crossprod(mx,mx)
的速度是crossprod(mx)
的两倍(至少在我引用的3列示例中)。当与t(mx)%*%mx
进行比较时,它们必须引用了第一个用例。但是,是的,我经常发现文档中缺乏细节令人恼火。有没有一种方法可以采用这种方法来做12个向量的点积,而不仅仅是2个向量?
library(microbenchmark)
set.seed(1)
n <- 5
lst <- setNames(replicate(n, sample(1:100000), simplify = FALSE),
paste0("V", sequence(n)))
microbenchmark(fun1(), fun2(), fun3())
# Unit: milliseconds
# expr min lq median uq max neval
# fun1() 6.909651 6.992031 8.432346 8.520301 74.12263 100
# fun2() 17.290101 18.811134 19.144601 21.292544 88.10602 100
# fun3() 22.841209 24.283113 24.427876 25.820158 91.14007 100
set.seed(1)
n <- 1000
lst <- setNames(replicate(n, sample(1:1000), simplify = FALSE),
paste0("V", sequence(n)))
system.time(fun1())
# user system elapsed
# 0.245 0.004 0.251
system.time(fun2())
# user system elapsed
# 0.407 0.016 0.425
system.time(fun3())
# user system elapsed
# 14.216 0.004 14.339