3

対角線 + 1 (つまり、対角線の右側の 1 列の値) をループして、データフレームの列に値を書き込む必要があります。

write.csv(data.frame(matrix[1,2], matrix[2,3], matrix[3,4])

値のすべての位置をリストするだけでなく、関数を使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

9

プログラムでインデックスを計算するという頭を悩ませることなくこれを行うための迅速な方法は、見過ごされがちなrow()andcol()関数を使用することです。これらは、行列の各要素に対して、その要素が属する行または列をそれぞれ返します。

対角線は、要素の行インデックスが列インデックスと等しい場所です。最初のサブ対角線は、行インデックスが列インデックスに 1 を加えたものに等しい場所であり、最初の上対角線は、行インデックスが列インデックスから 1 を引いたものに等しい場所です。

ここではいくつかの例を示します。

m <- matrix(1:25, ncol = 5)
m

> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25

対角線

m[row(m) == col(m)]
diag(m)

> m[row(m) == col(m)]
[1]  1  7 13 19 25
> diag(m) ## just to show this is correct
[1]  1  7 13 19 25

最初の下対角

m[row(m) == col(m) + 1

> m[row(m) == col(m) + 1]
[1]  2  8 14 20

最初の上対角線

m[row(m) == col(m) -1]

> m[row(m) == col(m) -1]
[1]  6 12 18 24

列インデックスに追加する値を増やすことで、高次の上対角と下対角を抽出できます。

データフレームの作成と書き出し

基本的にはすでにこれを持っていますが、

write.csv(data.frame(m[row(m) == col(m) + 1), file = "subdiag.csv")

下対角または上対角の一般的な関数

diags <- function(m, type = c("sub", "super"), offset = 1) {
  type <- match.arg(type)
  FUN <-
  if(isTRUE(all.equal(type, "sub")))
    `+`
  else
    `-`
  m[row(m) == FUN(col(m), offset)] 
}

使用中、次のものがあります。

> diags(m)
[1]  2  8 14 20
> diags(m, type = "super")
[1]  6 12 18 24
> diags(m, offset = 2)
[1]  3  9 15
于 2013-03-28T02:07:52.360 に答える
7

マトリックスを使用してインデックスを作成できます。

例えば

m <- matrix(1:25, ncol = 5)

オフ対角線は、次を使用してアクセスできます

offd <- cbind(1:4,2:5)


m[offd]

## [1]  6 12 18 24

これを行う関数を作成できます

offdiag <- function(m, offset){
  i <- seq_len(nrow(m)-offset)
  j <- i + offset
  m[cbind(i,j)]

}


offdiag(m, 1)
## [1]  6 12 18 24
offdiag(m, 2)
[1] 11 17 23
offdiag(m, 3)
## [1] 16 22
offdiag(m, 4)
## [1] 21
于 2013-03-28T01:28:25.957 に答える
6

部分行列を取り、次にその対角線を取ります。

mnel の使用m:

diag(m[, -1])
[1]  6 12 18 24

可変オフセットを持つ関数として (ただし、この形式では、mnel のソリューションよりもクリーンではありません):

offdiag <- function(m, offset) {
  s <- seq(offset)
  diag(m[,-s, drop=FALSE])
}

offdiag(m, 1)
## [1]  6 12 18 24
offdiag(m, 2)
## [1] 11 17 23
offdiag(m, 3)
## [1] 16 22
offdiag(m, 4)
## [1] 21
于 2013-03-28T01:52:50.740 に答える