To pytanie jest podobne do pytań zadawanych w związku z błędem zmiennoprzecinkowym w innych językach (na przykład here), jednak nie znalazłem satysfakcjonującego rozwiązania.Jak usunąć macierze z listy, które są duplikatami w błędach zmiennoprzecinkowych?
Pracuję nad projektem, który obejmuje badanie matryc, które mają pewne cechy. W związku z tym muszę wiedzieć, ile macierzy na liście jest unikalnych.
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)))
Lista ta jest następnie wypełniana przez obliczeń z danych opartych na elementach samples_list
. Po zapełnieniu mat_list
muszę usunąć duplikaty. Uruchamianie
mat_list <- unique(mat_list)
zawęża to wszystko; jednak wiele z tych elementów naprawdę znajduje się w granicach błędu maszyny. Funkcja unique
nie pozwala na określenie precyzji i nie udało mi się znaleźć kodu źródłowego do modyfikacji.
Jeden pomysł miałem było to:
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)
}
ale to wygląda tylko na różnice parami. Byłoby to proste, ale najprawdopodobniej nieskuteczne, aby to zrobić z zagnieżdżonymi pętlami for
.
Jakie metody znasz lub jakie masz pomysły na rozwiązywanie problemu identyfikacji i usuwania macierzy, które są w obrębie błędu maszynowego polegającego na duplikowaniu?
można umieścić kilka przykładów, gdzie uważasz, że odpowiedź jest "równy" i "nie równy" i określić, dlaczego? W tej chwili masz "źródło danych", ale nikt inny tego nie robi. Zachęcamy do używania 'dput (mat)'. –