1

したがって、NxN 行列があり、一部の行には値の inf があります。私がやりたいのは、それらを独自の別のマトリックスに移動することです。ここに例があります

 Matrix A
 1    3    9
 4    5    2
inf   6    7 
 0   inf   8

inf で行を削除する

 Matrix A
 1    3    9
 4    5    2

 Inf Matrix
inf   6    7 
 0   inf   8

ありがとう

4

2 に答える 2

2

これは、標準のサブセット化と関数を使用して行うことができますis.infinite

##First create some data
m = matrix(1:12, ncol=3)
m[3,1] = Inf; m[4,2] = Inf

次に、サブセット化する条件を計算します。

cond = apply(m, 1, function(i) any(is.infinite(i)))

次に、通常どおりサブセット化します。

m[!cond,]
m[cond,]

もう 1 つの方法 (ただし、私にはもう少しハックに思えます) は、行の合計を使用することです。

m[is.finitie(rowSums(m)),]
m[!is.finite(rowSums(m)),]

マトリックスに がある場合NA、これらのメソッドは異なる結果をもたらすというわけではありません!

m[2,2] = NA
m[!is.finite(rowSums(m)),]
m[cond,]
于 2013-03-05T17:24:50.253 に答える
1

数値の行列を扱っているため、高速abs()==なります。

 # Logical Vector
 InfRows <- 0!=rowSums(abs(A) == Inf, na.rm=TRUE)

 InfMat  <- A[InfRows,  ]
 A.clean <- A[!InfRows, ] 

編集:NAを許可する必要がある場合は、na.rm引数を使用してくださいrowSums()

# same as above, but using na.rm
InfRows <- 0 != rowSums(abs(A) == Inf, na.rm=TRUE)
例:
  A[2:3, 2] <- NA
  A  
     # [,1] [,2] [,3]
# [1,]    1    3    9
# [2,]    4   NA    2
# [3,]  Inf   NA    7
# [4,]    0  Inf    8

InfRows <- 0 != rowSums(abs(A) == Inf, na.rm=TRUE)

InfMat  <- A[InfRows,  ]
A.clean <- A[!InfRows, ] 

InfMat
#      [,1] [,2] [,3]
# [1,]  Inf   NA    7
# [2,]    0  Inf    8

A.clean
#      [,1] [,2] [,3]
# [1,]    1    3    9
# [2,]    4   NA    2
于 2013-03-05T18:13:59.103 に答える