2

Rで特定のベクトルから行列を作成しようとしていますが、簡単な方法でそれを達成する方法がわかりません. 以下に例を挙げます。マトリックスは「cbind」関数を使用して作成されました。

与えられたx

[1,] 1
[2,] 3
[3,] 4

簡単な方法で以下のマトリックスを作成するにはどうすればよいですか?

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    0    0    0    0    0
[2,]    3    1    0    0    0    0
[3,]    4    3    1    0    0    0
[4,]    0    4    3    1    0    0
[5,]    0    0    4    3    1    0
[6,]    0    0    0    4    3    1
[7,]    0    0    0    0    4    3
[8,]    0    0    0    0    0    4

ご協力ありがとうございました!

4

4 に答える 4

4

appendと_sapply

sapply(0:5, append, x = rep(0,5), values = c(1,3,4))

#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    0    0    0    0    0
# [2,]    3    1    0    0    0    0
# [3,]    4    3    1    0    0    0
# [4,]    0    4    3    1    0    0
# [5,]    0    0    4    3    1    0
# [6,]    0    0    0    4    3    1
# [7,]    0    0    0    0    4    3
# [8,]    0    0    0    0    0    4
于 2013-04-15T02:26:18.590 に答える
3
matrix(c(1,3,4,rep(0,6)),ncol=6,nrow=8)

警告が表示されますが、正しいマトリックスです。警告が気に入らない場合は、suppressWarnings を使用してください。

suppressWarnings(matrix(c(1,3,4,rep(0,6)),ncol=6,nrow=8))

もちろん、これをより一般的なケースに抽象化しようとしている場合は、その関数に注意してください。

于 2013-04-14T23:21:51.680 に答える
2

この方法は非常に直感的です。

x <- c(1,3,4)
n <- 6
m <- matrix(0,ncol=n,nrow=n+length(x)-1)
diag(m) <- 1
diag(m[-1,]) <- 3
diag(m[-c(1, 2),]) <- 4

対角線に沿った割り当ては、たとえば「for」ループを使用して簡単に自動化できます

for(i in seq_along(x)) diag(m[1:n + i - 1,]) <- x[i]

どちらの方法でも次の結果が得られます。

R> m
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    0    0    0    0    0
[2,]    3    1    0    0    0    0
[3,]    4    3    1    0    0    0
[4,]    0    4    3    1    0    0
[5,]    0    0    4    3    1    0
[6,]    0    0    0    4    3    1
[7,]    0    0    0    0    4    3
[8,]    0    0    0    0    0    4
于 2013-04-15T02:33:59.083 に答える
2

これは機能します。(編集: 投票はありません。おそらく電信的すぎますか?) アイデアは、適切な次元ですべてゼロの行列を作成し、行/列演算を ( row()andcol()関数を使用して) 使用して、要素の目的の値を埋めることrow-columnです。 0 から 2 の間 (つまり、対角線と最初の 2 つの下側非対角線)。これは、R の行列の列優先構造に依存しています ...

x <- c(1,3,4)
n <- 6
m <- matrix(0,ncol=n,nrow=n+length(x)-1)
betw <- function(x,a,b) x>=a & x<= b
m[betw(row(m)-col(m),0,2)] <- x
于 2013-04-14T23:20:12.813 に答える