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

使用appendsapply

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 之间(即对角线和前两个较低的非对角线)。这确实依赖于 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 回答