使用for循环创建矩阵

时间:2020-01-02 13:46:31

标签: r for-loop matrix

我正在尝试为n行和n + 1列创建以下矩阵A。 n可能约为20或30,但出于问题的考虑,我将其设为4和5。

enter image description here

这是我到目前为止所拥有的:

N <- 5             # n+1
n <- 4             # n
columns <- list()

# first column:
columns[1] <- c(-1, 1, rep(0, N-2))

# all other columns:
for(i in N:2) { 
 columns[i] <- c((rep(0, N-i), 1, -2, 1, rep(0, i-3)))
}

# combine into matrix:

A <- cbind(columns)

我不断收到以下错误消息:

In columns[1] <- c(-1, 1, rep(0, N - 2)) :
  number of items to replace is not a multiple of replacement length

后来

"for(i in N:2) { 
  columns[i] <- c((rep(0, N-i),"
 }
Error: unexpected '}' in "}"

3 个答案:

答案 0 :(得分:2)

  • 我想您可以尝试下面的for循环来创建矩阵A
N <- 5
n <- 4
A <- matrix(0,n,N)
for (i in 1:nrow(A)) {
  if (i == 1) {
    A[i,1:2] <- c(-1,1)
  } else {
    A[i,i+(-1:1)] <- c(1,-2,1)
  }
}

这样

> A
     [,1] [,2] [,3] [,4] [,5]
[1,]   -1    1    0    0    0
[2,]    1   -2    1    0    0
[3,]    0    1   -2    1    0
[4,]    0    0    1   -2    1
  • 另一种解决方案是使用outer,与for循环方法(即
  • )相比,该方法更快,看起来更紧凑。
A <- `diag<-`(replace(z<-abs(outer(1:n,1:N,"-")),!z %in% c(0,1),0),
              c(-1,rep(-2,length(diag(z))-1)))

答案 1 :(得分:2)

我认为与循环相比,它会更快,但是当我在5000x5001的示例上进行测试时,ThomasIsCoding的答案中的循环大约快了5倍。和那个一起去!

N = 5
n = N - 1

A = matrix(0, nrow = n, ncol = N)

delta = row(A) - col(A)

diag(A) = -2
A[delta %in% c(1, -1)] = 1
A[1, 1] = -1
A
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   -1    1    0    0    0
# [2,]    1   -2    1    0    0
# [3,]    0    1   -2    1    0
# [4,]    0    0    1   -2    1

答案 2 :(得分:0)

您可以使用data.table::shift将向量c(1, -2, 1, 0)从-1(向后移动/前导1)到n-1(向前移动/滞后n-1)的所有增量移动。将所有移位的输出绑定在一起。第一行的第一列元素不遵循此模式,因此固定在末尾。

library(data.table)

out <- do.call(cbind, shift(c(1, -2, 1, 0), seq(-1, n - 1), fill = 0))
out[1, 1] <- -1

out
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   -1    1    0    0    0
# [2,]    1   -2    1    0    0
# [3,]    0    1   -2    1    0
# [4,]    0    0    1   -2    1