R矩阵/数组乘积变换
我想用两个矩阵做一个矩阵和积的计算。sumproduct在一个矩阵中有行,在另一个矩阵中有列R矩阵/数组乘积变换,r,arrays,matrix,sumproduct,rcpp,R,Arrays,Matrix,Sumproduct,Rcpp,我想用两个矩阵做一个矩阵和积的计算。sumproduct在一个矩阵中有行,在另一个矩阵中有列 set.seed(123) y <- matrix(sample(1:6,6,FALSE), nrow=3, ncol=2) x <- matrix(sample(1:5,15,TRUE), nrow=5, ncol=3) > x [,1] [,2] [,3] [1,] 5 4 3 [2,] 2 3 2 [3,] 2 3
set.seed(123)
y <- matrix(sample(1:6,6,FALSE), nrow=3, ncol=2)
x <- matrix(sample(1:5,15,TRUE), nrow=5, ncol=3)
> x
[,1] [,2] [,3]
[1,] 5 4 3
[2,] 2 3 2
[3,] 2 3 3
[4,] 4 3 1
[5,] 3 5 5
> y
[,1] [,2]
[1,] 3 4
[2,] 6 5
[3,] 2 1
我可以使用循环来实现这一点,但如果有一个函数能够自动实现这一点,那就容易多了。我建议采用下一种方法。有一个名为
crossprod()
的函数,但用于定义矩阵的维度。你可以查一下。下一个代码可能很有用:
set.seed(123)
#Data
y <- matrix(sample(1:6,6,FALSE), nrow=3, ncol=2)
x <- matrix(sample(1:5,15,TRUE), nrow=5, ncol=3)
守则:
#Code
z <- t(sapply(1:nrow(x), function(i){
x[i, ] %*% sapply(1:ncol(y), function(j) {y[,j]})}))
我建议采取下一个办法。有一个名为
crossprod()
的函数,但用于定义矩阵的维度。你可以查一下。下一个代码可能很有用:
set.seed(123)
#Data
y <- matrix(sample(1:6,6,FALSE), nrow=3, ncol=2)
x <- matrix(sample(1:5,15,TRUE), nrow=5, ncol=3)
守则:
#Code
z <- t(sapply(1:nrow(x), function(i){
x[i, ] %*% sapply(1:ncol(y), function(j) {y[,j]})}))
这里是一种在矩阵的索引上使用
outer
to运算符的方法。矢量化
允许我们在外部
中组合结果。如果您需要性能,我真的认为使用循环会相对容易
set.seed(123)
y[1,47 46
#> [2,] 32 32
#> [3,] 31 24
#> [4,] 18 16
#> [5,] 37 34
出于好奇,这花了约5分钟的时间想出了一个解决方案:
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
IntegerMatrix定制_交叉产品(IntegerMatrix x,IntegerMatrix y){
int nrow=x.行();
int ncol=y.cols();
整合素矩阵ans(nrow,ncol);
对于(int i=0;i
基准:
bench::mark(
使用外部=
外部(序号(x)),
序号(ncol(y)),
FUN=矢量化(函数(i,j)和(x[i,]*y[,j]))
,自定义_crossprod(x,y)
)
#一个tibble:2x13
##表达式最小中位数`itr/sec`mem_alloc`gc/sec`
##
##1使用外部179.8us 191.2us 4394。11.73KB 4.37
##2定制_crossprod(x,y)4.9us 6.6us 135309。2.49KB 0
这里是一种在矩阵索引上使用外部
to运算符的方法。矢量化
允许我们在外部
中组合结果。如果您需要性能,我真的认为使用循环会相对容易
set.seed(123)
y[1,47 46
#> [2,] 32 32
#> [3,] 31 24
#> [4,] 18 16
#> [5,] 37 34
出于好奇,这花了约5分钟的时间想出了一个解决方案:
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
IntegerMatrix定制_交叉产品(IntegerMatrix x,IntegerMatrix y){
int nrow=x.行();
int ncol=y.cols();
整合素矩阵ans(nrow,ncol);
对于(int i=0;i
基准:
bench::mark(
使用外部=
外部(序号(x)),
序号(ncol(y)),
FUN=矢量化(函数(i,j)和(x[i,]*y[,j]))
,自定义_crossprod(x,y)
)
#一个tibble:2x13
##表达式最小中位数`itr/sec`mem_alloc`gc/sec`
##
##1使用外部179.8us 191.2us 4394。11.73KB 4.37
##2定制_crossprod(x,y)4.9us 6.6us 135309。2.49KB 0
@user20650提供了最合适的答案
似乎x%*%y就足够了
set.seed(123)
y <- matrix(sample(1:6,6,FALSE), nrow=3, ncol=2)
x <- matrix(sample(1:5,15,TRUE), nrow=5, ncol=3)
x %*% y
> x %*% y
[,1] [,2]
[1,] 47 46
[2,] 32 32
[3,] 31 24
[4,] 18 16
[5,] 37 34
set.seed(123)
y@user20650提供了最合适的答案
似乎x%*%y就足够了
set.seed(123)
y <- matrix(sample(1:6,6,FALSE), nrow=3, ncol=2)
x <- matrix(sample(1:5,15,TRUE), nrow=5, ncol=3)
x %*% y
> x %*% y
[,1] [,2]
[1,] 47 46
[2,] 32 32
[3,] 31 24
[4,] 18 16
[5,] 37 34
set.seed(123)
谢谢,这是一个简洁的解决方案,像“for循环”,但不是。非常感谢大多数类似于“for循环”,但不是:)。很多循环都是隐藏的,我不知道。我写了一些类似于上面第二段代码的东西。我觉得编写循环是低效的,因为似乎有函数可以完成所有事情。谢谢,这是一个简洁的解决方案,就像“for循环”,但不是。非常感谢大多数类似于“for循环”,但不是:)。很多循环都是隐藏的,我不知道。我写了一些类似于上面第二段代码的东西。我觉得编写循环是低效的,因为似乎有函数可以完成所有事情。感谢Prob遗漏了一些东西,但这只是x%*%y
@Duck,谢谢这太棒了。我不知道你能用sapply做到这一点。Thanks@H.Cheung美好的你现在知道怎么做了!如果你认为这个答案对你有帮助,你可以接受:)这取决于你@Duck,科尔的另一个答案也很好,所以我不知道该怎么做。我是新来的,不知道当两个答案都一样好的时候,这里的礼仪是什么?在我看来你们都是赢家,但我会为你们打勾!ICheers@user20650-天哪。你说得对,这很有效!浏览所有建议的方法都很有趣。至少有助于学习R的工作原理。感谢Prob遗漏了一些东西,但这只是x%*%y
@Duck,谢谢这太棒了。我不知道你能用sapply做到这一点。Thanks@H.Cheung美好的你现在知道怎么做了!如果你认为这个答案对你有帮助,你可以接受:)这取决于你@Duck,科尔的另一个答案也很好,所以我不知道该怎么做。我是新来的,不知道当两个答案都一样好的时候,这里的礼仪是什么?在我看来你们都是赢家,但我会为你们打勾!ICheers@user20650-天哪。你说得对,这很有效!浏览所有建议的方法都很有趣。至少有助于学习R的工作原理。谢谢