3

私には難しいR計算があり、コードを実行するために V と L と呼ばれる 2 台のコンピューターのオプションがあります。V は L より速いはずですが、私はこれを経験しませんでした。それで、私はそれをテストすることにしました。

簡単なテストとして、3000*3000 行列を 500 回反転させて時間を記録するよう依頼することにしました。

set.seed(123)
I=500
n=3000
time=matrix(NA,ncol=3,nrow=I)
for(i in 1:I){
t0<-proc.time()
x<-solve(matrix(runif(n^2),n))
mt1<-proc.time()
time[i,]<-(mt1-t0)[1:3]
}

問題は、特定の反復中にスタックしたことです。理由はわかりませんが、生成された行列が特異に近いためだと思われます。というわけで、コードを改善したいと思います。私は3つの方法を考えることができます:

  1. 生成された行列が簡単に可逆であることを確認してください。しかし、どうすればこれを強制できますか??? もちろん、どのソリューションも計算コストがかからない必要があります。そうしないと、演習が無意味になります。
  2. 時間がかかりすぎるR場合は、その反復をスキップするように依頼しますか? solveしかし、もう一度言いますが、どうすればいいですか?
  3. 代わりに別の計算タスクを割り当てますが、推奨事項はありますか?
4

1 に答える 1

8

ランダム行列は確率 1 で可逆です。つまり、実際には、特異な (つまり、可逆でない) 行列を生成する確率は非常に小さいということです。

さらに、R が行列を反転するために使用するアルゴリズムの観点からは、「簡単に反転できる」行列などというものはありません。アルゴリズムが成功するか、行列が特異で失敗すると判断します。しかし、「本当に一生懸命」試みて、マトリックスを反転するのに長い時間がかかるというシナリオはありません。これは決定論的アルゴリズムであり、0(または特定のイプシロンよりも小さい値) に実行されます。この場合、失敗するか、失敗しません。

どのイテレーションで行き詰まりますか? 行列の反転で行き詰まっているのは確かですか?ガベージ コレクションのような時間がかかっているわけではありませんか?

あなたが説明した問題を再現できません。ランダム シード 123 から始めて、コードを使用して 500 個のランダムな 3000x3000 行列を、大きなタイミングの不一致なしで連続して反転できます。「反転しにくい行列」を直接生成するランダムシードを見つけることができますか?

于 2013-10-01T01:30:40.443 に答える