如何使用列主要顺序将矢量中的值插入矩阵?

时间:2014-11-05 21:30:53

标签: r matrix-indexing

我想将一组表示为矢量的n值插入矩阵中的相应位置集。现实世界的应用涉及将一组n个海面温度值插入到区域的图像中,该区域被表示为具有尺寸nrow x ncol>的网格。 n我已经确定了应该接收温度值的n个水像素。我遇到的问题是温度值的排序好像它们来自列主矩阵而不是用于索引R网格的行主要排序。

这是我的意思的玩具示例。

> grid <- matrix(0,4,4)
> grid                       # define the base grid
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    0    0
[4,]    0    0    0    0

> temps <- c(9,9,9,9,9)     # we have 5 temperature values
> locs <- c(2,3,4,6,7)      # locations in the base grid that are water

> grid[locs] <- temps       # not really what I want - substitution in row-major order
> grid
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    9    9    0    0
[3,]    9    9    0    0
[4,]    9    0    0    0

理想的结果是:

     [,1] [,2] [,3] [,4]
[1,]    0    9    9    9
[2,]    0    9    9    0
[3,]    0    0    0    0
[4,]    0    0    0    0

我想我可以玩转换网格,进行替换然后将其转置回来,但我认为有更好的方法来解决这个问题。

4 个答案:

答案 0 :(得分:6)

以下是几个选项,每个选项都适用于任意维度的矩阵:


arrayIndByRow <- function(ind, dim) {
   arrayInd(ind, rev(dim))[,2:1]
}

grid[arrayIndByRow(locs, dim(grid))] <- temps
grid
#      [,1] [,2] [,3] [,4]
# [1,]    0    9    9    9
# [2,]    0    9    9    0
# [3,]    0    0    0    0
# [4,]    0    0    0    0

f <- function(ind, dim) {
    nr <- dim[1]
    nc <- dim[2]
    ii <- ind - 1
    ((ii %/% nc) + 1) + nr*(ii %% nc)
}

grid[f(locs, dim(grid))] <- 1:5
grid
#      [,1] [,2] [,3] [,4]
# [1,]    0    1    2    3
# [2,]    0    4    5    0
# [3,]    0    0    0    0
# [4,]    0    0    0    0

答案 1 :(得分:3)

执行此操作的一种方法是使用所需数据创建新矩阵,并在创建时指定byrow=TRUE。为此,您必须创建一个中间向量来存储和修改grid

的数据
grid <- matrix(rep(0,16),ncol=4)
##
temps <- c(9,9,9,9,9)     
locs <- c(2,3,4,6,7)      
##
#vgrid <- as.numeric(grid)
vgrid <- c(grid)
vgrid[locs] <- temps
##
> matrix(vgrid,ncol=ncol(grid),byrow=TRUE)
     [,1] [,2] [,3] [,4]
[1,]    0    9    9    9
[2,]    0    9    9    0
[3,]    0    0    0    0
[4,]    0    0    0    0

答案 2 :(得分:3)

如果您有方形矩阵,您可以编写一个小模数函数,用正确的数字替换您的数字:

new_num <- function(x,num_rows){
  x = x - 1
  row    <- x %/% num_rows
  column <- x %% num_rows
  newnum <- column * num_rows + row + 1
  return(newnum)
}

temps <- c(9,9,9,9,9)     
locs <- c(2,3,4,6,7)

new_locs <- new_num(locs,4)

M <- matrix(0,4,4)
M[new_locs] <- temps

你也可以使用非方形矩阵,这只是有点困难。

答案 3 :(得分:3)

你可以用索引做一些工作。首先,我们根据列数生成矩阵长度的序列。然后我们迭代地将1添加到序列中。我们这样做是为了行数。然后对位置矢量的该矢量进行子集化将为我们提供矩阵中的位置。

x <- seq(1, length(grid), ncol(grid))
grid[sapply(0:(nrow(grid)-1), "+", x)[locs]] <- temps
grid

#      [,1] [,2] [,3] [,4]
# [1,]    0    9    9    9
# [2,]    0    9    9    0
# [3,]    0    0    0    0
# [4,]    0    0    0    0