4

Rで働いています。

私は行列構造を持っていますが、それぞれ同じ長さ N の 3 つのリスト IND1、IND2、および VAL に格納されています。次のようなマトリックス MAT の VAl に値を格納する必要があります。

for each i in 1 to N:
    MAT[IND1(i), IND2(i)] == VAL(i)

ご想像のとおり、MAT の最終的なサイズは必ずしも NxN であるとは限りませんが、必要なサイズはわかっています (サイズを知る必要がある場合は m と呼びます。私にとっては正方行列でなければならないため)。

Matlabには、まさにこれを行うスパース行列を作成するための優れた機能がありますが、言語Rでこれを達成する必要があります。できればループなしで、これが可能かどうかを知っている人はいますか? 前もって感謝します。

PS:私は明白なことを試しました:

MAT <- matrix(nrow=m, ncol=m)
MAT[IND1, IND2] <- VAL

しかし、奇妙な結果が得られます(すべての行に同じ繰り返し値があります)

4

2 に答える 2

6

DWin の言うとおりです。Matrix パッケージが最適です。ただし、大量のデータがある場合、置換タイプの値の置換がハングアップしたり、時間がかかったりする可能性があることがわかりました。より良い方法は、クラス sparseMatrix オブジェクトを作成し、必要に応じてクラス マトリックスに変換することです。元。

set.seed(1)
n=50
x <- sample(seq(100), n)
y <- sample(seq(100), n)
z <- runif(n)
cbind(x,y,z)

library(Matrix)
s.mat <- sparseMatrix(i=x, j=y, x=z)
dim(s.mat)
image(s.mat)

#convert to a class matrix if needed
mat <- as.matrix(s.mat)
mat[which(mat==0)] <- NaN

ここに画像の説明を入力

于 2012-04-26T13:57:27.540 に答える
4

Matrixパッケージは、さまざまなスパース行列クラスを提供します。スパース行列オブジェクトが作成された後、上記で説明した方法で値を正確にロードします。

library(Matrix)
?Matrix

...開始します。ちなみに、あなたが説明した方法で密行列をロードするためのコードは次のようになります。

M <- matrix(NA, nrow=max(c(IND1,IND2)), ncol=max(c(IND1,IND2)) ) # could use higher numbers
M[ cbind(IND1, IND2) ] <- VAL
于 2012-04-26T13:32:02.017 に答える