質問: r、null vs naに行列を割り当てる最良の方法は? 正方行列を作成するrコードを書いています。だから私のアプローチは: 正しいサイズの行列を割り当てます マトリックスの各要素をループし、適切な値を入力します 私の質問は本当に簡単です:この行列を事前に割り当てる最良の方法は何ですか?これまでのところ、2つの方法があります。> x <- matrix(data=na,nrow=3,ncol=3) > x [,1] [,2] [,3] [1,] na na na [2,] na na na [3,] na na na または> x <- list() > length(x) <- 3^2 > dim(x) <- c(3,3) > x [,1] [,2] [,3] [1,] null null null [2,] null null null [3,] null null null 私が見る限り、前者は後者よりも簡潔な方法です。また、前者はマトリックスをnaで埋めますが、後者はnullで埋められます。これを行うための「より良い」方法はどれですか?この場合、これは統計計算であり、この操作は大規模なデータセットで実行されるため、「より良い」を「より良いパフォーマンス」と定義しています。前者のほうが簡潔ですが、息をのむほど簡単に理解できるわけではないので、どちらにしてもいいと思います。また、rのnaとnullの違いは何ですか? ?naおよび?nullは、「na」の長さが「1」であるのに対し、nullの長さは「0」であることを教えてくれます。またはベストプラクティスですか?これは、マトリックスの作成に使用する方法に影響します。
回答: この記事 によれば、na_real_で事前に割り当てることで、naで事前に割り当てるよりもうまくいくことができます。記事から: 「x」のセルのいずれかに数値を割り当てるとすぐに、新しい値が割り当てられたときに、最初にマトリックスを数値に強制する必要があります。最初に割り当てられた論理マトリックスは無駄に割り当てられ、不要なメモリフットプリントとガベージコレクターの余分な作業が追加されるだけです。代わりにna_real_(または整数の場合はna_integer_)を使用して割り当てます 推奨されるとおり、テストしてみましょう。testfloat = function(mat){ n=nrow(mat) for(i in 1:n){ mat[i,] = 1.2 } } >system.time(testfloat(matrix(data=na,nrow=1e4,ncol=1e4))) user system elapsed 3.08 0.24 3.32 > system.time(testfloat(matrix(data=na_real_,nrow=1e4,ncol=1e4))) user system elapsed 2.91 0.23 3.14 そして整数の場合:testint = function(mat){ n=nrow(mat) for(i in 1:n){ mat[i,] = 3 } } > system.time(testint(matrix(data=na,nrow=1e4,ncol=1e4))) user system elapsed 2.96 0.29 3.31 > system.time(testint(matrix(data=na_integer_,nrow=1e4,ncol=1e4))) user system elapsed 2.92 0.35 3.28 私のテストケースでは違いはわずかですが、そこにあります。