gpt4 book ai didi

r - 如何从列表中删除在浮点错误中重复的矩阵?

转载 作者:行者123 更新时间:2023-12-04 18:10:05 25 4
gpt4 key购买 nike

这个问题类似于在其他语言中提出的有关浮点错误的问题(例如 here ),但是我还没有找到令人满意的解决方案。

我正在开展一个项目,该项目涉及调查具有某些特征的矩阵。作为其中的一部分,我需要知道列表中有多少矩阵是唯一的。

 D <- as.matrix(read.table("datasource",...))
mat_list <- vector('list',length=length(samples_list))
mat_list <- lapply(1:length(samples_list),function(i) matrix(data=0,nrow(D),ncol(D)))

该列表随后由基于 samples_list 的元素的数据计算填充。 .后 mat_list已填充,我需要删除重复项。运行
mat_list <- unique(mat_list)

把事情缩小了很多;然而,其中许多元素确实在彼此的机器误差范围内。函数 unique不允许指定精度,我也找不到修改的源代码。

我的一个想法是:
ErrorReduction<-function(mat_list, tol=2){
len <- length(mat_list)
diff <- mat_list[[i]]-mat_list[[i+1]]
for(i in 1:len-1){
if(norm(diff,"i")<tol){
mat_list[[i+1]] <- mat_list[i]
}
}
mat_list<-unique(mat_list)
return(mat_list)
}

但这仅着眼于成对差异。使用嵌套 for 执行此操作很简单但很可能效率低下循环。

你知道什么方法,或者你有什么想法来处理识别和删除重复的机器错误中的矩阵的问题?

最佳答案

这是一个适用的函数 all.equal每对使用 outer并删除所有重复项:

approx.unique <- function(l) {
is.equal.fun <- function(i, j)isTRUE(all.equal(norm(l[[i]] - l[[j]], "M"), 0))
is.equal.mat <- outer(seq_along(l), seq_along(l), Vectorize(is.equal.fun))
is.duplicate <- colSums(is.equal.mat * upper.tri(is.equal.mat)) > 0
l[!is.duplicate]
}

一个例子:
a <- matrix(runif(12), 4, 3)
b <- matrix(runif(12), 4, 3)
c <- matrix(runif(12), 4, 3)

all <- list(a1 = a, b1 = b, a2 = a, a3 = a, b2 = b, c1 = c)

names(approx.unique(all))
# [1] "a1" "b1" "c1"

关于r - 如何从列表中删除在浮点错误中重复的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16290058/

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