1

次の 3x3 正方行列aとベクトルがありxます。

a = matrix(c(1.0, 0.1, 0.5, 
             0.1, 1.0, 0.9,
             0.5, 0.9, 1.0), nrow=3, ncol=3)

x = c(0.1,0.2,0.3)

基本的に、行列とベクトルの上三角を使用して式をたどりたいと思います

y = (a12 - (x1/x2)^2 + (a13 - x1/x3)^2 + (a23 - x2/x3)^2

上記の式に R で次の for ループを使用すると、次のエラーが発生します。

Error in a[i, j] : subscript out of bounds

何か間違ったことをしている場合は、お知らせいただければ幸いです。

## initialize y
y = 0 

for (i in 1 : nrow(a)-1){
  for (j in i+1 : nrow(a)){
    y = y + ((a[i,j]) - (x[i]/x[j])^2
  }
}
4

2 に答える 2

11

これを使用してループを回避できます。

b <- a - outer(x,x,`/`)
sum(b[upper.tri(b)]^2)

結果

[1] 0.2422222
于 2013-09-01T12:42:57.400 に答える
4

かっこがいくつかありません。そうしないn:mと、予期しないシーケンスが定義されます。これは、R にとって他のベクトルのように見え、他の数学と相互作用する可能性があります。

元のコード、数式を印刷インデックスに置き換えたもの:

for (i in 1 : nrow(a)-1){
+   for (j in i+1 : nrow(a)){
+ print(c(i,j))
+ }
+ }
[1] 0 1
[1] 0 2
[1] 0 3
[1] 1 2
[1] 1 3
[1] 1 4
[1] 2 3
[1] 2 4
[1] 2 5

それら0の と5は範囲内にありません。

しかし、括弧をどこにでも置くと、次のように動作します。

for (i in (1 : (nrow(a)-1))){
+   for (j in ((i+1) : nrow(a))){
+ print(c(i,j))
+ }
+ }
[1] 1 2
[1] 1 3
[1] 2 3
于 2013-09-01T11:45:53.733 に答える