5

この質問は、他の言語での浮動小数点エラーに関する質問 (たとえば、こちら) に似ていますが、満足のいく解決策は見つかりませんでした。

特定の特性を共有するマトリックスの調査を含むプロジェクトに取り組んでいます。その一環として、リスト内の一意の行列の数を知る必要があります。

 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では精度を指定することはできず、修正するソース コードを見つけることができませんでした。

私が持っていた1つのアイデアはこれでした:

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ネストされたループでこれを行うのは簡単ですが、おそらく非効率的です。

重複しているというマシンエラーの範囲内にある行列を特定して削除するという問題を処理するために、どのような方法を知っていますか、またはどのようなアイデアを持っていますか?

4

2 に答える 2

6

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"
于 2013-04-30T00:16:41.997 に答える
1

all.equal「マシンエラー内」でオブジェクトを比較するものを探していると思います。チェックアウトしてください?all.equal

于 2013-04-30T00:10:34.473 に答える