9

画像のサイズ変更とまったく同じように、R統計ソフトウェアに行列を縮小する機能があるのではないかと思いました。MATLABの関数imresize()はまさに私が探しているものです(周囲の点の平均を取ると思いますが、これはわかりません)が、この関数に相当するRがあるかどうか疑問に思っています。

この質問は以前にこのフォーラムに投稿されましたが、RではなくMATLABを参照しています 。Matlab平均を使用したベクトルの「スケールダウン」「imresize()関数 を使用できない理由は何ですか?」で始まる投稿 まさに私が探しているものですが、RではMATLABではありません。

世界中に緯度経度の気温グリッドがあり、これが64*128の気温マトリックスで表されているとします。ここで、同じデータを新しいマトリックスに含めたいが、グリッドを再スケーリングして、世界中の気温の71*114マトリックスにしたいとします。私がそうすることを可能にする関数は私が探しているものです(ここでも、imresize()関数ですが、RではMATLABではありません)

ありがとうございました。スティーブ

4

2 に答える 2

11

resample()これを行う1つの方法は、rasterパッケージの関数を使用することです。

最初に、これを使用してグリッドを再スケーリングする方法を示し、次に、より小さなラスターオブジェクトへの適用のより簡単な例を示します。

resample()行列のサイズを変更するために使用

library(raster)
m <- matrix(seq_len(68*128), nrow=68, ncol=128, byrow=TRUE)

## Convert matrix to a raster with geographical coordinates
r <- raster(m)
extent(r) <- extent(c(-180, 180, -90, 90))

## Create a raster with the desired dimensions, and resample into it
s <- raster(nrow=71, ncol=114)
s <- resample(r,s)

## Convert resampled raster back to a matrix
m2 <- as.matrix(s)

resample()それがあなたが望むことをすることを視覚的に確認してください:

library(raster)
## Original data (4x4)
rr <- raster(ncol=4, nrow=4)
rr[] <- 1:16
## Resize to 5x5
ss <- raster(ncol=5,  nrow=5)
ss <- resample(rr, ss)
## Resize to 3x3
tt <- raster(ncol=3, nrow=3)
tt <- resample(rr, tt)
## Plot for comparison
par(mfcol=c(2,2))
plot(rr, main="original data")
plot(ss, main="resampled to 5-by-5")
plot(tt, main="resampled to 3-by-3")

ここに画像の説明を入力してください

于 2012-06-20T18:53:53.603 に答える
6

Josh O'Brienによって投稿された回答は大丈夫で、(出発点として)役に立ちましたが、膨大なデータのリストがあったため、このアプローチは遅すぎました。以下の方法は良い代替手段です。それはfieldsはるかに速く使用し、動作します。

関数

rescale <- function(x, newrange=range(x)){
  xrange <- range(x)
  mfac <- (newrange[2]-newrange[1])/(xrange[2]-xrange[1])
  newrange[1]+(x-xrange[1])*mfac
}

ResizeMat <- function(mat, ndim=dim(mat)){
  if(!require(fields)) stop("`fields` required.")

  # input object
  odim <- dim(mat)
  obj <- list(x= 1:odim[1], y=1:odim[2], z= mat)

  # output object
  ans <- matrix(NA, nrow=ndim[1], ncol=ndim[2])
  ndim <- dim(ans)

  # rescaling
  ncord <- as.matrix(expand.grid(seq_len(ndim[1]), seq_len(ndim[2])))
  loc <- ncord
  loc[,1] = rescale(ncord[,1], c(1,odim[1]))
  loc[,2] = rescale(ncord[,2], c(1,odim[2]))

  # interpolation
  ans[ncord] <- interp.surface(obj, loc)

  ans
}

それがどのように機能するか見てみましょう

## Original data (4x4)
rr <- matrix(1:16, ncol=4, nrow=4)
ss <- ResizeMat(rr, c(5,5)) 
tt <- ResizeMat(rr, c(3,3)) 

## Plot for comparison
par(mfcol=c(2,2), mar=c(1,1,2,1))
image(rr, main="original data", axes=FALSE)
image(ss, main="resampled to 5-by-5", axes=FALSE)
image(tt, main="resampled to 3-by-3", axes=FALSE)

サイズ変更されたマトリックス

于 2014-05-02T13:36:45.417 に答える