【问题标题】:R - Given a matrix and a power, produce multiple matrices containing all combinations of matrix columnsR - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有组合
【发布时间】: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

【问题讨论】:

    标签: r matrix 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, ])))
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      相关资源
      最近更新 更多