如何对矩阵中行的所有组合求和?

Wil*_*T-E 2 r matrix

我正在寻找一个矩阵中所有可能的行组合。一个类似于rowSums()函数但不产生nrow()和的函数,它将产生nrow() ^ nrow()和。

例如:

set.seed(10)
dummymat <-  matrix(floor(runif(9, 0, 2)), nrow = 3, ncol = 3)
Run Code Online (Sandbox Code Playgroud)

产生矩阵:

     [,1] [,2] [,3]
[1,]    1    1    0
[2,]    0    0    0
[3,]    0    0    1
Run Code Online (Sandbox Code Playgroud)

为了找到矩阵的每个可能的行总和,可以编写以下效率很低的代码:

allrowsums <- c()

for(i in 1:nrow(dummymat)) {
  firstcolval <- dummymat[i,1]
  for(j in 1:nrow(dummymat)) {
    secondcolval <- dummymat[j,2]
    for(k in 1:nrow(dummymat)) {
      thirdcolval <- dummymat[k,3]
      rowsum <- firstcolval + secondcolval + thirdcolval
      allrowsums <- append(allrowsums,rowsum)
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

[1] 2 2 3 1 1 2 1 1 2 1 1 2 0 0 1 0 0 1 1 1 2 0 0 1 0 0 1
Run Code Online (Sandbox Code Playgroud)

我可以为更大的矩阵编写哪些更简洁的代码?

Djo*_*ork 5

您可以expand.grid用来创建列元素的所有组合的数据框。

dummymat_expand <- expand.grid(x=dummymat[,1], y=dummymat[,2], z=dummymat[,3])
Run Code Online (Sandbox Code Playgroud)

在这里,您只需调用rowSums即可获取所有可能的总和组合。

rowSums(dummymat_expand)
Run Code Online (Sandbox Code Playgroud)

编辑回答问题。要将代码应用于具有可变列长的矩阵,请注意expand.grid可以将向量,因子或列表作为输入。因此,您可以创建要供稿的列元素列表expand.grid

# create a list of column elements
dummymat_column_list <- lapply(1:ncol(dummymat), function(x) dummymat[, x])
expand.grid(dummymat_column_list)
Run Code Online (Sandbox Code Playgroud)

  • @ WillT-E,具有1000行,结果的长度为1000 ^ 1000,或大约10 ^ 3000。宇宙中原子数的估计约为10 ^ 80。是的,您会遇到一些内存问题。您要解决的实际问题是什么? (2认同)
  • 选择合理数量的组合,而不是尝试*每个*组合,而是随机采样多个组合。如果您想花哨的话,请分批执行,一次说500k,然后在每批之间进行一些诊断。我的猜测是,您很快就会收敛,无论是否添加更多批次,外观都几乎相同。 (2认同)