R - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有组合
Posted
技术标签:
【中文标题】R - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有组合【英文标题】:R - Given a matrix and a power, produce multiple matrices containing all combinations of matrix columns 【发布时间】:2018-08-01 15:10:22 【问题描述】:给定一个矩阵mat
(大小为N
by M
)和一个幂p
(例如4),产生p
矩阵,其中每个p
-th矩阵包含所有可能的矩阵mat
中各列的组合。
在我当前的方法中,我生成p
-th 矩阵,然后在下一次调用中使用它来生成p+1
th 矩阵。对于给定的功率p
,这是否可以“自动化”,而不是手动完成?
当谈到 R 时,我是一个新手,并且了解与以下尝试相比,可能有一种更有效和更优雅的方式来实现此解决方案...
N = 5
M = 3
p = 4
mat = matrix(1:(N*M),N,M)
mat_1 = mat
mat_2 = t(sapply(1:N, function(i) tcrossprod(mat_1[i, ], mat[i, ])))
mat_3 = t(sapply(1:N, function(i) tcrossprod(mat_2[i, ], mat[i, ])))
mat_4 = t(sapply(1:N, function(i) tcrossprod(mat_3[i, ], mat[i, ])))
谁能提供一些建议?我的目标是为给定矩阵mat
和幂p
创建一个函数,以更“自动化”的方式输出p
不同的矩阵。
让我开始的相关问题:How to multiply columns of two matrix with all combinations
【问题讨论】:
【参考方案1】:这解决了你的问题。
N = 5
M = 3
p = 4
mat = matrix(1:(N*M),N,M)
f=function(x) matrix(apply(x,2,"*",mat),nrow(x))
rev(Reduce(function(f,x)f(x), rep(c(f), p-1), mat, T,T))
【讨论】:
谢谢你,干得好!对于N = 15000
、M=3
和p=4
,这比@Aleh 的解决方案平均快约200 毫秒
能否将此结果推广到仅以给定顺序生成唯一列p
?例如,对于N=5
,M=4
,p=2
,我们得到列 (1,1), (1,2), (1,3), (2,1), (2,2) 的乘积, (2,3), (3,1), (3,2), (3,3)。我想减少代码只计算列 (1,1)、(1,2)、(1,3)、(2,2)、(2,3)、(3,3) 之间的产品。但我想为每个p
-th 订单执行此操作。
很久没有回答这个问题了。看来这个答案可能没有解决问题。说不准【参考方案2】:
你可以这样做
N = 5
M = 3
p = 4
mat = matrix(1:(N*M),N,M)
res_mat <- list()
res_mat[[1]] <- mat
for(i in 2:p)
res_mat[[i]] <- t(sapply(1:N, function(j) tcrossprod(res_mat[[i-1]][j, ], res_mat[[1]][j, ])))
【讨论】:
以上是关于R - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有组合的主要内容,如果未能解决你的问题,请参考以下文章
R:如何在给定行和列标签以及二元运算符的情况下构造数据框/矩阵