2013-04-14 21 views
2

我想从R中给定的矢量创建矩阵,但我不知道如何以简单的方式实现它。我在下面给出一个例子。矩阵是使用“cbind”函数制作的。如何创建如下所示的矩阵R

定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 

谢谢你的帮忙!

+0

这是否有与之相关的语言,或者这是一个数学问题? – Kermit

+0

对不起,这个问题很模糊,现在很明显。我正在努力在R. – user1618083

回答

2

这是有效的。 (编辑:没有投票,也许太电报?)这个想法是创建一个适当的尺寸的全零矩阵,然后使用行/列算术(使用row()col()函数)来填充所需的值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 
+0

中做到这一点,并在最终作业中进行大量回收。是的,对这个想法的更好的解释确实有帮助。 –

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)) 

当然,要注意与功能,如果你正在尝试抽象这更一般的情况。

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 
+0

非常好的解决方案,命名其他参数,以便迭代器进入'append'中的'after'参数。 –

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 
+1

如果在解决方案中使用了向量'x'(例如,使用执行'diag <-'赋值的循环),那么看起来会好很多。 –

+0

@MatthewLundberg,增加了解决方案的for-loop实现。 – Ryogi

+0

谢谢大家,所有这些解决方案都适合我。 mnel的方法非常优雅! – user1618083