9

我想知道是否有一个函数可以缩小 R 统计软件中的矩阵,就像调整图像大小一样。MATLAB 中的函数imresize()正是我正在寻找的(我相信它取周围点的平均值,但我不确定),但我想知道这个函数是否有 R 等价物。

这个问题之前已经在这个论坛上发布过,但是参考了 MATLAB,而不是 R: Matlab "Scale Down" a Vector with Averagesimresize()这篇文章以“你不能使用这个函数 的任何原因吗?”开头。正是我正在寻找的东西,但在 R 中,而不是在 MATLAB 中。

假设我有一个世界各地的经纬度网格,假设它由一个 64*128 的温度矩阵表示。现在假设我想将相同的数据包含在一个新矩阵中,但我想重新调整我的网格,使其成为一个 71*114 的全球温度矩阵。我正在寻找一个允许我这样做的函数(同样是 imresize() 函数,但在 R 中,而不是在 MATLAB 中)

谢谢你。史蒂夫

4

2 回答 2

11

一种方法是使用包中的resample()函数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 回答