我可以在R中有一个向量矢量

时间:2016-10-05 21:33:25

标签: r vector sequence

w范围从-2到2乘以0.1时,我希望生成所有可能的s,其中 w_minw_max是5 x 1向量。但我不知道如何表示结果。我想我需要一个矢量,每个元素也作为一个矢量,即矢量矢量。

s <- seq(-2, 2, by = 0.1)

result = c()

for (i in 1:20) {
   w = s[i] * w_min + (1 - s[i]) * w_max
   ## what do I need to do here??
   }

result

1 个答案:

答案 0 :(得分:1)

你想要一个矩阵,你有很多列,而每列都是一个向量

要提供玩具示例,我需要让w_minw_max为5 * 1向量”具体:

## note, they are just plain vectors without dimension
## if you have a `5 * 1` matrix, use `c(w_min)` and `c(w_max)` to drop dimension
w_min <- 1:5
w_max <- 2:6

另外,为了缩小示例,我会考虑s <- seq(-2, 2, by = 1)步骤1

首先,考虑基于循环的方法:

w <- matrix(0, 5, length(s))  ## set up a `5 * length(s)` matrix
for (i in 1:length(s)) {
  ## fill i-th column of the matrix
  w[, i] <- s[i] * w_min + (1 - s[i]) * w_max
  }

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

然后,矢量化方法:

## read `?outer`; the default function to apply is `FUN = "*"` for multiplication
w <- outer(w_min, s) + outer(w_max, 1 - s)

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

除了矩阵,您还可以将结果存储在矢量列表中。

w <- vector("list", length(s))  ## set up a `length(s)` list
for (i in 1:length(s)) {
  ## fill i-th element of the list; note the `[[i]]`
  w[[i]] <- s[i] * w_min + (1 - s[i]) * w_max
  }

w
#[[1]]
#[1] 4 5 6 7 8
#
#[[2]]
#[1] 3 4 5 6 7
#
#[[3]]
#[1] 2 3 4 5 6
#
#[[4]]
#[1] 1 2 3 4 5
#
#[[5]]
#[1] 0 1 2 3 4

但这里没有真正的矢量化方法。我们最多可以通过lapply隐藏循环:

w <- lapply(s, function (x) x * w_min + (1 - x) * w_max)

w
#[[1]]
#[1] 4 5 6 7 8
#
#[[2]]
#[1] 3 4 5 6 7
#
#[[3]]
#[1] 2 3 4 5 6
#
#[[4]]
#[1] 1 2 3 4 5
#
#[[5]]
#[1] 0 1 2 3 4