gpt4 book ai didi

r - 在逻辑矩阵中有效地组合 (AND) 列组

转载 作者:行者123 更新时间:2023-12-01 10:19:53 25 4
gpt4 key购买 nike

我正在寻找一种有效的方法,通过“AND ing”将逻辑矩阵中的选定列组合在一起,并以新矩阵结束。我正在寻找的示例:

matrixData <- rep(c(TRUE, TRUE, FALSE), 8)
exampleMatrix <- matrix(matrixData, nrow=6, ncol=4, byrow=TRUE)
exampleMatrix
[,1] [,2] [,3] [,4]
[1,] TRUE TRUE FALSE TRUE
[2,] TRUE FALSE TRUE TRUE
[3,] FALSE TRUE TRUE FALSE
[4,] TRUE TRUE FALSE TRUE
[5,] TRUE FALSE TRUE TRUE
[6,] FALSE TRUE TRUE FALSE

要相互进行 AND 运算的列在长度为 ncol(exampleMatrix) 的数值向量中指定,其中要组合在一起的列具有相同的值(从 1n 的值,其中 n <= ncol(exampleMatrix)1:n 中的每个值至少使用一次)。结果矩阵的列应按 1:n 的顺序排列.例如,如果指定列组的向量是

colGroups <- c(3, 2, 2, 1)

那么得到的矩阵就是

      [,1]  [,2]  [,3]
[1,] TRUE FALSE TRUE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE FALSE
[4,] TRUE FALSE TRUE
[5,] TRUE FALSE TRUE
[6,] FALSE TRUE FALSE

在结果矩阵中的位置

[,1] = exampleMatrix[,4] 
[,2] = exampleMatrix[,2] & exampleMatrix[,3]
[,3] = exampleMatrix[,1]

我目前的做法基本上是这样的:

finalMatrix <- matrix(TRUE, nrow=nrow(exampleMatrix), ncol=3)
for (i in 1:3){
selectedColumns <- exampleMatrix[,colGroups==i, drop=FALSE]
finalMatrix[,i] <- rowSums(selectedColumns)==ncol(selectedColumns)
}

在哪里rowSums(selectedColumns)==ncol(selectedColumns)是将矩阵的所有列与在一起的有效方法。

我的问题是我在非常大的矩阵(数百万行)上执行此操作,并且我正在寻找任何方法来加快速度。我的第一直觉是使用 apply以某种方式,但我看不到任何方法可以使用它来提高效率,因为我没有在 for 中执行操作循环很多次,而是循环中的操作很慢。

此外,任何减少内存分配的技巧都会非常有用,因为我目前必须运行 gc()经常在循环中运行以避免完全耗尽内存,这是一个非常昂贵的操作,也会显着降低一切速度。谢谢!

一个更有代表性的例子,这是一个更大的exampleMatrix :

matrixData <- rep(c(TRUE, TRUE, FALSE), 8e7)
exampleMatrix <- matrix(matrixData, nrow=6e7, ncol=4, byrow=TRUE)

最佳答案

从您的示例中,我了解到列很少而行很多。在这种情况下,只需对 colGroups 执行一个简单的循环就会很有效(比您的建议提高 30%):

for (jj in seq_along(colGroups)) 
finalMatrix[ , colGroups[jj]] =
finalMatrix[ , colGroups[jj]] & exampleMatrix[ , jj]

我认为如果不进行并行化就很难解决这个问题。如果有更多的列,这个循环是可并行化的(尽管并行化必须小心地(分批)完成)。

关于r - 在逻辑矩阵中有效地组合 (AND) 列组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014215/

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