gpt4 book ai didi

r - 'R' 没有循环的矩阵子集

转载 作者:行者123 更新时间:2023-12-04 05:06:32 24 4
gpt4 key购买 nike

大约六个月前我开始使用 R 并且我在 R 方面获得了一些经验。最近,我遇到了一个关于矩阵中子集的问题,并希望帮助我制定更有效的解决方案。

我想做的是以下内容。假设我有一个矩阵和两个向量,如下所示:

# matrix
a <- matrix(seq(1,100,by=1),10,10)
# vector (first column of matrix a)
b <- c(2,4,5,6,7,8)
# vector (column numbers of matrix a)
c <- c(5,3,1,4,6,2)

只是重申一下,
  • 矢量 b指矩阵的第一列 a .
  • 矢量 c指矩阵的列数a .

  • 我想得到 tmp99 <- a[b,c:8] .但是,当我这样做时,我收到以下警告消息。
    Warning message:
    In c:8 : numerical expression has 6 elements: only the
    first used (index has to be scalar and not vector)

    所以,我尝试使用循环和列表来解决这个问题,我得到了我想要的解决方案。我假设有比这更省时的解决方案。到目前为止,我所拥有的解决方案如下:
    a <- matrix(seq(1,100,by=1),10,10)
    b <- c(2,4,5,6,7,8)
    c <- c(5,3,1,4,6,2)
    tmp <- list()
    for (i in 1:length(b)) tmp[[i]] <- c(a[b[i],(c[i]:8)])
    tmp99 <- t(sapply(tmp, '[', 1:max(sapply(tmp, length))))
    tmp99[is.na(tmp99)] <- 0

    我想知道的是是否有办法避免使用循环来实现上述目的,因为我的矩阵维度是 200000 x 200并且由于我必须这样做很多(在我的问题中, bc 被确定为代码另一部分的一部分,因此我无法使用绝对索引号),我想减少花费的时间相同。任何帮助将不胜感激。谢谢。

    最佳答案

    您可以尝试某种矩阵索引解决方案,就像这样。目前还不清楚它是否真的会更快。在小情况下,我认为肯定会,但在大情况下,从创建矩阵到索引的开销可能比仅运行 for 循环花费的时间更长。为了获得更好的答案,请构建一个与您的数据集类似的数据集,以便我们进行测试。

    idx.in <- cbind(rep(b, 8-c+1), unlist(lapply(c, function(x) x:8)))
    idx.out <- cbind(rep(seq_along(b), 8-c+1), unlist(lapply(c, function(x) 1:(8-x+1))))
    tmp99 <- array(0, dim=apply(idx.out, 2, max))
    tmp99[idx.out] <- a[idx.in]

    这是一个带有矩阵索引的版本,但它对每一行单独进行。这可能会更快,具体取决于要替换的行数和列数。您想要避免的是内存不足,for 循环可以帮助解决此问题,因为它不会同时将每个步骤的所有详细信息保留在内存中。
    out <- array(0, dim=c(length(b), 8-min(c)+1))
    for(idx in seq_along(b)) {
    out[cbind(idx, 1:(8-c[idx]+1))] <- a[cbind(b[idx], c[idx]:8)]
    }
    out

    关于r - 'R' 没有循环的矩阵子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15475074/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com