-2

ここで何が間違っているのかわかりません。

ee <- eigen(crossprod(X))$values
for(i in 1:length(ee)){
if(ee[i]==0:1e^-9) stop("singular Matrix")}

固有値アプローチを使用して、行列が特異かどうかを判断しようとしています。行列の固有値の 1 つが 0 から 10^-9 の間にあるかどうかを調べようとしています。上記のように if ステートメントを正しく使用して目標を達成するにはどうすればよいですか? これにアプローチする他の方法はありますか?

ベクトルのゼロ固有値を連結したい場合はどうすればよいですか

zer <-NULL
ee <- eigen(crossprod(X))$values 
for(i in 1:length(ee)){ 
if(abs(ee[i])<=1e-9)zer <- c(zer,ee[i])} 

それをしてもいいですか?

4

3 に答える 3

3

@AriBFriedmanはかなり正しいです。ただし、他にもいくつかの問題があります

  • 1e^-9する必要があります1e-9
  • 0:1e-9を返します0( :0 から 1e-9 までの 1 によるシーケンスを作成するため、 のみを返します0。詳細については、を参照?`:`してください
  • 小数で使用==すると、浮動小数点演算が原因で問題が発生します

記述された形式では、コードは要素が必要かどうかを (個別に) チェックee[i] == 0します (また、浮動小数点演算の観点からも意味がありません)。

固有値がこの小さな数より小さい場合を探しているので、より小さい ( <) を使用します。

あなたが探しているのは次のようなものです

if(any(abs(ee) < 1e-9))  stop('singular matrix')

0(または小さい) 固有ベクトルを取得する場合は、次を使用します。which

# this will give the indexs (which elements are small)
small_values <- which(abs(ee) < 1e-9))
# and those small values
ee[small_values]

for実行されることはすべてベクトル化されるため、ループは必要ありません。

于 2012-09-12T01:18:15.170 に答える
2

if長さ 1の単一の引数を取ります。

orifelseを使用して、logical のベクトルを長さ 1 の logical ベクトルに変換してみてください。any()all()

于 2012-09-12T00:54:33.340 に答える
1

データを再現する例を次に示します。

X <- matrix(1:10,1:10)
ee <- eigen(crossprod(X))$values

これはANDif anyの値をテストしますee> 0< 1e-9

if (any((ee > 0) & (ee < 1e-9))) {stop("singular matrix")}
于 2012-09-12T01:22:36.010 に答える