Это довольно старая школа, я использую ее в больших циклах, чтобы избежать создания экземпляра другого буфера строк.
void tocout(long a)
{
long c = 1;
if(a<0) {a*=-1;cout<<"-";}
while((c*=1000)<a);
while(c>1)
{
int t = (a%c)/(c/1000);
cout << (((c>a)||(t>99))?"":((t>9)?"0":"00")) << t;
cout << (((c/=1000)==1)?"":",");
}
}
Вот ваш упрощенный код с некоторыми примерами данных (вот как вы должны задать вопрос здесь).
library(raster)
f <- system.file("external/rlogo.grd", package="raster")
Landsat <- raster(f, 1)
AVHRR <- raster(f, 3)
error <- Landsat - AVHRR
#You can do
#[1] 25.52578
#mae <- mean(abs(values(error)))
#mae
#[1] 15.28597
Но безопасным для памяти способом было бы сделать
cellStats(error, "rms")
#[1] 25.52742
cellStats(abs(error), "mean")
#[1] 15.28597
Обратите внимание, что я возвращаю единственное «глобальное» значение, тогда как ваши функции возвращают растр - предполагая, что возможно Вы хотите "локальную" статистику ошибок. Но это имеет смысл, только если у вас есть многослойные растровые данные. В вашем примере вы не делаете; но см. ниже для местного примера.
Так в чем причина вашей ошибки? Вы делаете
#actual <- c(Landsat)
#predicted <- c(AVHRR)
#error <- actual - predicted
Или с нашими примерами данных
error <- c(Landsat) - c(AVHRR)
#Error in c(Landsat) - c(AVHRR) : non-numeric argument to binary operator
Это потому, что c(Landsat)
создает list
и вы не можете вычесть два списка.
class(c(Landsat))
#[1] "list"
Вы можете сделать
error <- c(Landsat)[[1]] - c(AVHRR)[[1]]
(но зачем вам)
Если вы хотите «локальные» значения, вы можете сделать что-то вроде ниже:
library(raster)
f <- system.file("external/rlogo.grd", package="raster")
Landsat <- stack(f)
AVHRR <- Landsat[[3:1]]
error <- Landsat - AVHRR
mae <- mean(abs(error))
plot(mae)