मेरे पास एक मूल्य रेखापुंज है:
m <- matrix(c(2,4,5,5,2,8,7,3,1,6,
5,7,5,7,1,6,7,2,6,3,
4,7,3,4,5,3,7,9,3,8,
9,3,6,8,3,4,7,3,7,8,
3,3,7,7,5,3,2,8,9,8,
7,6,2,6,5,2,2,7,7,7,
4,7,2,5,7,7,7,3,3,5,
7,6,7,5,9,6,5,2,3,2,
4,9,2,5,5,8,3,3,1,2,
5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
r <- raster(m)
extent(r) <- matrix(c(0, 0, 10, 10), nrow=2)
plot(r)
text(r)
इस रेखापुंज से, मैं इस चित्रण के अनुसार वर्तमान सेल के 8 आसन्न कक्षों को मान (या मान कैसे बदल सकता हूं) बता सकता हूं? मैंने इस कोड लाइन से वर्तमान सेल के भीतर एक लाल बिंदु रखा:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
यहाँ, अपेक्षित परिणाम होगा:
जहां वर्तमान सेल का मूल्य (यानी, मूल्य रेखापुंज में 5) को 0 से बदल दिया जाता है।
कुल मिलाकर, 8 आसन्न कोशिकाओं के नए मूल्यों की गणना निम्नानुसार की जानी चाहिए:
नया मान = लाल आयत में निहित सेल वैल्यू का औसत * वर्तमान सेल (लाल बिंदु) और आसन्न सेल के बीच की दूरी (यानी, तिरछे आसन्न कोशिकाओं के लिए sqrt (2) या 1 अन्यथा)
अपडेट करें
जब आसन्न कोशिकाओं के लिए सीमा रेखापुंज सीमा से बाहर होती है, तो मुझे आसन्न कोशिकाओं के लिए नए मूल्यों की गणना करने की आवश्यकता होती है जो शर्तों का सम्मान करते हैं। आसन्न कोशिकाएं जो शर्तों का सम्मान नहीं करती हैं, वे "NA" के बराबर होंगी।
उदाहरण के लिए, यदि [पंक्ति, कर्नल] संकेतन का उपयोग करके c (5,5) के बजाय संदर्भ स्थिति c (1,1) है, तो नीचे-दाएं कोने पर केवल नए मान की गणना की जा सकती है। इस प्रकार, अपेक्षित परिणाम होगा:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
उदाहरण के लिए, यदि संदर्भ स्थिति c (3,1) है, तो शीर्ष-दाएं, दाएं और नीचे-दाएं कोनों पर केवल नए मानों की गणना की जा सकती है। इस प्रकार, अपेक्षित परिणाम होगा:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
यहां फ़ंक्शन का उपयोग करके मेरा यह पहला प्रयास है focal
लेकिन मुझे स्वचालित कोड बनाने में थोड़ी कठिनाई है।
आसन्न कोशिकाओं का चयन करें
mat_perc <- matrix(c(1,1,1,1,1,
1,1,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1), nrow=5, ncol=5, byrow = T)
cell_perc <- adjacent(r, cellFromRowCol(r, 5, 5), directions=mat_perc, pairs=FALSE, sorted=TRUE, include=TRUE)
r_perc <- rasterFromCells(r, cell_perc)
r_perc <- setValues(r_perc,extract(r, cell_perc))
plot(r_perc)
text(r_perc)
यदि आसन्न कोशिका वर्तमान कोशिका के ऊपरी-बाएँ कोने पर स्थित है
focal_m <- matrix(c(1,1,NA,1,1,NA,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि आसन्न सेल वर्तमान सेल के ऊपरी-मध्य कोने में स्थित है
focal_m <- matrix(c(1,1,1,1,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि आसन्न कोशिका वर्तमान कोशिका के ऊपरी-बाएँ कोने पर स्थित है
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि आसन्न सेल वर्तमान सेल के बाएं कोने पर स्थित है
focal_m <- matrix(c(1,1,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि निकटवर्ती सेल वर्तमान सेल के दाहिने कोने पर स्थित है
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि आसन्न सेल वर्तमान सेल के निचले-बाएँ कोने पर स्थित है
focal_m <- matrix(c(NA,NA,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि आसन्न सेल वर्तमान सेल के निचले-मध्य कोने में स्थित है
focal_m <- matrix(c(NA,NA,NA,1,1,1,1,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
यदि आसन्न सेल वर्तमान सेल के निचले-दाएं कोने पर स्थित है
focal_m <- matrix(c(NA,NA,NA,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
mat <- matrix(c(1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0), nrow=5, ncol=5, byrow = T)
f.rast <- function(x) mean(x)*sqrt(2)
aggr <- as.matrix(focal(r, mat, f.rast))
। मैं वर्तमान कोशिका के केवल 8 आसन्न कोशिकाओं और सभी रेखापुंज के लिए परिणाम कैसे प्राप्त कर सकता हूं? यहाँ, परिणाम होना चाहिए res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
:। आपका बहुत बहुत धन्यवाद !
raster
पैकेज औरfocal()
: समारोह (पी 90 प्रलेखन।) Cran.r-project.org/web/packages/raster/raster.pdf