4

下三角行列インデックス (行と列のペア) を生成する必要があります。現在の実装は、特に対称行列が大きくなる (50K 行を超える) 場合、(メモリに関して) 非効率的です。より良い方法はありますか?

rows <- 2e+01
id <- which(lower.tri(matrix(, rows, rows)) == TRUE, arr.ind=T)
head(id)

#      row col
# [1,]   2   1
# [2,]   3   1
# [3,]   4   1
# [4,]   5   1
# [5,]   6   1
# [6,]   7   1
4

2 に答える 2

2

複数のマトリックスを作成する必要があるため、アプローチは非常に遅いです。を使用して最初のマトリックスを作成しますmatrix。この関数lower.triは内部で 3 つの行列を作成します。結果を と比較するとTRUE、5 番目のマトリックスが作成されます。ちなみに:との比較TRUEは不要です。

次のアプローチでは、マトリックスは作成されませんが、インデックスが計算されます。

rows <- 2e+01 # number of rows and columns (20)

x <- rev(abs(sequence(seq.int(rows - 1)) - rows) + 1)
y <- rep.int(seq.int(rows - 1), rev(seq.int(rows - 1)))

idx <- cbind(x, y)

(もう少し高速なアプローチが必要な場合は、seq.int(rows - 1)このコマンドを 3 回使用する代わりに、の結果を変数に割り当てることができます。)

元のソリューションと比較します。

id <- which(lower.tri(matrix(, rows, rows)) == TRUE, arr.ind=T)

all(id == idx)
# TRUE
于 2014-01-03T07:40:48.757 に答える