Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r中的combn()函数_R_Dot Product_Combn - Fatal编程技术网

r中的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

我试图对所有可能的向量组合执行点积。我能找到所有可能的组合。我只是不太明白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","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