2013-04-15 37 views
6

Giả sử tôi có một 3 5 ma trận trong R:dữ liệu Interpolating trong R

4 5 5 6 8 
3 4 4 5 6 
2 3 3 3 4 

Tôi muốn suy ở giữa những giá trị này để tạo ra một ma trận kích thước 15 bởi 25. Tôi cũng muốn xác định nếu nội suy là tuyến tính, gaussian, vv Làm cách nào tôi có thể làm điều này?

Ví dụ, nếu tôi có một ma trận nhỏ như thế này

2 3 
1 3 

và tôi muốn nó trở thành 3 bằng 3, sau đó nó có thể trông như

2 2.5 3 
    1.5 2.2 3 
    1 2  3 
+1

Không rõ bạn muốn gì. Vui lòng cung cấp đầu ra mẫu. –

+0

bài đăng này có thể có một số trợ giúp? http://stackoverflow.com/questions/3093455/3d-geometry-how-to-interpolate-a-matrix – Arun

+0

@ Chạy mà có vẻ hữu ích mặc dù phải có một chức năng được xây dựng trong R để làm điều này ... – CodeGuy

Trả lời

6
app <- function(x, n) approx(x, n=n)$y # Or whatever interpolation that you want 

apply(t(apply(x, 1, function(x) app(x, nc))), 2, function(x) app(x, nr)) 
    [,1] [,2] [,3] 
[1,] 2.0 2.50 3 
[2,] 1.5 2.25 3 
[3,] 1.0 2.00 3 
+0

Để theo dõi trên ý kiến ​​của tôi tại câu trả lời của tôi: nếu tôi đang đọc mã này một cách chính xác, thiết lập 'nc' và' nr' cho số lượng cols/hàng bạn muốn cho ma trận đầu ra sẽ cho phép mở rộng bất đối xứng tùy ý. –

0

thời gian dài trước đây Tôi đã viết một món đồ chơi tương tự, ngoại trừ tôi không bao giờ có xung quanh để xác định chức năng nội suy. Ngoài ra còn có raster::disaggregate.

zexpand<-function(inarray, fact=2, interp=FALSE, ...) { 
# do same analysis of fact to allow one or two values, fact >=1 required, etc. 
fact<-as.integer(round(fact)) 
switch(as.character(length(fact)), 
      '1' = xfact<-yfact<-fact, 
      '2'= {xfact<-fact[1]; yfact<-fact[2]}, 
      {xfact<-fact[1]; yfact<-fact[2];warning(' fact is too long. First two values used.')}) 
if (xfact < 1) { stop('fact[1] must be > 0') } 
if (yfact < 1) { stop('fact[2] must be > 0') } 
bigtmp <- matrix(rep(t(inarray), each=xfact), nrow(inarray), ncol(inarray)*xfact, byr=T) #does column expansion 
bigx <- t(matrix(rep((bigtmp),each=yfact),ncol(bigtmp),nrow(bigtmp)*yfact,byr=T)) 
# the interpolation would go here. Or use interp.loess on output (won't 
# handle complex data). Also, look at fields::Tps which probably does 
# a much better job anyway. Just do separately on Re and Im data 
return(invisible(bigx)) 
} 
+0

Cảm ơn bạn đã phản hồi. Điều này khác biệt hay tốt hơn câu trả lời của Math Lundberg như thế nào? – CodeGuy

+0

@CodeGuy Nếu tôi thực sự đặt một hàm nội suy trong đó (về cơ bản thay thế hàm 'rep' chỉ sao chép các hàng hoặc cột), nó sẽ thực hiện gần như chính xác điều tương tự, ngoại trừ việc tôi cho phép các mở rộng khác nhau trong cột và kích thước hàng. Như Matthew đã viết, bạn có thể hoán đổi trong bất kỳ nội suy nào bạn muốn cũng là mã. –

+0

Tôi hiểu. Cảm ơn vì sự trả lời. – CodeGuy

Các vấn đề liên quan