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+1th 矩阵。对于给定的功率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 = 15000M=3p=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:如何在给定行和列标签以及二元运算符的情况下构造数据框/矩阵

题目1474:矩阵幂

BUPT复试专题—矩阵幂

关于循环矩阵的一些理解和应用

bzoj3231[Sdoi2008]递归数列 矩阵乘法+快速幂

矩阵的幂运算