7

ベクトルとして表された n 値のセットを、対応する行列内の位置のセットに挿入したいと考えています。実際のアプリケーションでは、n 行 x ncol > n の次元のグリッドとして表される領域の画像に 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

4 に答える 4

6

以下に 2 つのオプションを示します。それぞれ任意の次元の行列で機能します。


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
于 2014-11-06T03:46:22.010 に答える
3

これを行う 1 つの方法は、必要なデータを含む新しいマトリックスを作成し、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
于 2014-11-05T21:38:05.023 に答える
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

非正方行列でもこれを行うことができますが、少し難しいです。

于 2014-11-05T23:34:28.487 に答える