# 各輸入檔案乃採用原發問者上傳之 csv 和 nc 檔
library(magrittr)
library(data.table)
library(ncdf4)
# 各種讀資料
analog.indices <-
fread("HIRAM_WRF_analog.indices(1979-2005).csv", col.names = c("day", "i1", "i2")) %>%
.[1:9862, -1] %>% # 發問者要求刪除 9862 列之後;第 1 欄刪除
as.matrix # 轉 matrix 之後較好懂
analog.weights <-
fread("HIRAM_WRF_weights(1979-2005).csv", col.names = c("day", "w1", "w2")) %>%
.[1:9862, -1] %>% # 發問者要求刪除 9862 列之後;第 1 欄刪除
as.matrix # 轉 matrix 之後較好懂
HIRAM_WRF_data <- nc_open("197901-200512_pr_axis_time_domain.nc")
hiram_wrf_lon <- ncvar_get(HIRAM_WRF_data, "lon")
hiram_wrf_lat <- ncvar_get(HIRAM_WRF_data, "lat")
hiram_wrf_time <- ncvar_get(HIRAM_WRF_data, "time")
hiram_wrf_pr <- ncvar_get(HIRAM_WRF_data, "pr")
dim(hiram_wrf_pr)
pr.new <-
array(
NA_real_,
dim = c(dim(hiram_wrf_pr)[1:2], nrow(analog.indices)),
# 填上合適的 dimnames(尚無實際作用)
dimnames = list(
hiram_wrf_lon
%>% sprintf("%1.2f", .
), hiram_wrf_lat
%>% sprintf("%1.2f", .
), 1:nrow(analog.indices)
)
)
##########################################
# 方法 A:直接列式子
# analog.indices 逐列處理(1:10227)
# 每一圈會為 pr.new 填上一層資料
pr.new.A <- pr.new
for (i in 1:nrow(analog.indices)) {
pr.new.A[, , i] <-
hiram_wrf_pr[, , analog.indices[i, 1]] * analog.weights[i, 1] +
hiram_wrf_pr[, , analog.indices[i, 2]] * analog.weights[i, 2]
}
##########################################
# 方法 B:二層巢式迴圈
# 外層 i 照舊走直的,內層 j 走橫的
# 每一小圈會計算部份累積的總和
# 每一大圈會為 pr.new 填上一層資料
pr.new.B <- pr.new
for (i in 1:nrow(analog.indices)) {
partialSum <- 0.0
for (j in 1:ncol(analog.indices)) {
partialSum <-
partialSum +
hiram_wrf_pr[, , analog.indices[i, j]] * analog.weights[i, j]
}
pr.new.B[, , i] <- partialSum
# 以上用了一個以迴圈求累積加總的常見小技巧
# 沒看過的話,看看這個求 4+6+7 的例子:
# a <- c(4,6,7); b <- 0; for(i in 1:3){b <- b + a[i]}; print(b)
}
###################################################
# 檢查第11日第 (1,1) 格的結果
analog.indices[11,]
# i1 i2
# 10 11
analog.weights[11,]
# w1 w2
# 0.2276517 0.7622840
print(hiram_wrf_pr[1, 1, 10] * 0.2276517 + hiram_wrf_pr[1, 1, 11] * 0.762284) # 0.007988894
print(pr.new.A[1, 1, 11]) # 0.007988894
print(pr.new.B[1, 1, 11]) # 0.007988894
identical(pr.new.A, pr.new.B) # 二者全等
IyDlkITovLjlhaXmqpTmoYjkuYPmjqHnlKjljp/nmbzllY/ogIXkuIrlgrPkuYsgY3N2IOWSjCBuYyDmqpQKCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShuY2RmNCkKCiMg5ZCE56iu6K6A6LOH5paZCmFuYWxvZy5pbmRpY2VzIDwtCiAgZnJlYWQoIkhJUkFNX1dSRl9hbmFsb2cuaW5kaWNlcygxOTc5LTIwMDUpLmNzdiIsCiAgICAgICAgY29sLm5hbWVzID0gYygiZGF5IiwgImkxIiwgImkyIikpICU+JQogIC5bMTo5ODYyLCAtMV0gJT4lICMg55m85ZWP6ICF6KaB5rGC5Yiq6ZmkIDk4NjIg5YiX5LmL5b6M77yb56ysIDEg5qyE5Yiq6ZmkCiAgYXMubWF0cml4ICMg6L2JIG1hdHJpeCDkuYvlvozovIPlpb3mh4IKYW5hbG9nLndlaWdodHMgPC0KICBmcmVhZCgiSElSQU1fV1JGX3dlaWdodHMoMTk3OS0yMDA1KS5jc3YiLAogICAgICAgIGNvbC5uYW1lcyA9IGMoImRheSIsICJ3MSIsICJ3MiIpKSAlPiUKICAuWzE6OTg2MiwgLTFdICU+JSAjIOeZvOWVj+iAheimgeaxguWIqumZpCA5ODYyIOWIl+S5i+W+jO+8m+esrCAxIOashOWIqumZpAogIGFzLm1hdHJpeCAjIOi9iSBtYXRyaXgg5LmL5b6M6LyD5aW95oeCCkhJUkFNX1dSRl9kYXRhIDwtIG5jX29wZW4oIjE5NzkwMS0yMDA1MTJfcHJfYXhpc190aW1lX2RvbWFpbi5uYyIpCmhpcmFtX3dyZl9sb24gPC0gbmN2YXJfZ2V0KEhJUkFNX1dSRl9kYXRhLCAibG9uIikKaGlyYW1fd3JmX2xhdCA8LSBuY3Zhcl9nZXQoSElSQU1fV1JGX2RhdGEsICJsYXQiKQpoaXJhbV93cmZfdGltZSA8LSBuY3Zhcl9nZXQoSElSQU1fV1JGX2RhdGEsICJ0aW1lIikKaGlyYW1fd3JmX3ByIDwtIG5jdmFyX2dldChISVJBTV9XUkZfZGF0YSwgInByIikKZGltKGhpcmFtX3dyZl9wcikKCnByLm5ldyA8LQogIGFycmF5KAogICAgTkFfcmVhbF8sCiAgICBkaW0gPSBjKGRpbShoaXJhbV93cmZfcHIpWzE6Ml0sIG5yb3coYW5hbG9nLmluZGljZXMpKSwKICAgICMg5aGr5LiK5ZCI6YGp55qEIGRpbW5hbWVz77yI5bCa54Sh5a+m6Zqb5L2c55So77yJCiAgICBkaW1uYW1lcyA9IGxpc3QoCiAgICAgIGhpcmFtX3dyZl9sb24gJT4lIHNwcmludGYoIiUxLjJmIiwgLiksCiAgICAgIGhpcmFtX3dyZl9sYXQgJT4lIHNwcmludGYoIiUxLjJmIiwgLiksCiAgICAgIDE6bnJvdyhhbmFsb2cuaW5kaWNlcykKICAgICkKICApCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyDmlrnms5UgQe+8muebtOaOpeWIl+W8j+WtkAojIGFuYWxvZy5pbmRpY2VzIOmAkOWIl+iZleeQhu+8iDE6MTAyMjfvvIkKIyDmr4/kuIDlnIjmnIPngrogcHIubmV3IOWhq+S4iuS4gOWxpOizh+aWmQpwci5uZXcuQSA8LSBwci5uZXcKZm9yIChpIGluIDE6bnJvdyhhbmFsb2cuaW5kaWNlcykpIHsKICBwci5uZXcuQVssICwgaV0gPC0KICAgIGhpcmFtX3dyZl9wclssICwgYW5hbG9nLmluZGljZXNbaSwgMV1dICogYW5hbG9nLndlaWdodHNbaSwgMV0gKwogICAgaGlyYW1fd3JmX3ByWywgLCBhbmFsb2cuaW5kaWNlc1tpLCAyXV0gKiBhbmFsb2cud2VpZ2h0c1tpLCAyXQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyDmlrnms5UgQu+8muS6jOWxpOW3ouW8j+i/tOWciAojIOWkluWxpCBpIOeFp+iIiui1sOebtOeahO+8jOWFp+WxpCBqIOi1sOapq+eahAojIOavj+S4gOWwj+WciOacg+ioiOeul+mDqOS7vee0r+epjeeahOe4veWSjAojIOavj+S4gOWkp+WciOacg+eCuiBwci5uZXcg5aGr5LiK5LiA5bGk6LOH5paZCnByLm5ldy5CIDwtIHByLm5ldwpmb3IgKGkgaW4gMTpucm93KGFuYWxvZy5pbmRpY2VzKSkgewogIHBhcnRpYWxTdW0gPC0gMC4wCiAgZm9yIChqIGluIDE6bmNvbChhbmFsb2cuaW5kaWNlcykpIHsKICAgIHBhcnRpYWxTdW0gPC0KICAgICAgcGFydGlhbFN1bSArCiAgICAgIGhpcmFtX3dyZl9wclssICwgYW5hbG9nLmluZGljZXNbaSwgal1dICogYW5hbG9nLndlaWdodHNbaSwgal0KICB9CiAgcHIubmV3LkJbLCAsIGldIDwtIHBhcnRpYWxTdW0KICAjIOS7peS4iueUqOS6huS4gOWAi+S7pei/tOWciOaxgue0r+epjeWKoOe4veeahOW4uOimi+Wwj+aKgOW3pwogICMg5rKS55yL6YGO55qE6Kmx77yM55yL55yL6YCZ5YCL5rGCIDQrNis3IOeahOS+i+WtkO+8mgogICMgYSA8LSBjKDQsNiw3KTsgYiA8LSAwOyBmb3IoaSBpbiAxOjMpe2IgPC0gYiArIGFbaV19OyBwcmludChiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyDmqqLmn6XnrKwxMeaXpeesrCAoMSwxKSDmoLznmoTntZDmnpwKYW5hbG9nLmluZGljZXNbMTEsXQojIGkxIGkyIAojIDEwIDExIAphbmFsb2cud2VpZ2h0c1sxMSxdCiMgICAgICAgIHcxICAgICAgICB3MiAKIyAwLjIyNzY1MTcgMC43NjIyODQwIApwcmludChoaXJhbV93cmZfcHJbMSwgMSwgMTBdICogMC4yMjc2NTE3ICsgaGlyYW1fd3JmX3ByWzEsIDEsIDExXSAqIDAuNzYyMjg0KSAjIDAuMDA3OTg4ODk0CnByaW50KHByLm5ldy5BWzEsIDEsIDExXSkgIyAwLjAwNzk4ODg5NApwcmludChwci5uZXcuQlsxLCAxLCAxMV0pICMgMC4wMDc5ODg4OTQKaWRlbnRpY2FsKHByLm5ldy5BLCBwci5uZXcuQikgIyDkuozogIXlhajnrYkK