Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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矩阵/数组乘积变换_R_Arrays_Matrix_Sumproduct_Rcpp - Fatal编程技术网

R矩阵/数组乘积变换

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

我想用两个矩阵做一个矩阵和积的计算。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    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的工作原理。谢谢