forked from PeterRochford/SkillMetricsToolbox
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcentered_rms_dev.m
55 lines (50 loc) · 1.7 KB
/
centered_rms_dev.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function [crmsd] = centered_rms_dev(predicted,reference)
%CENTERED_RMS_DEV Calculate centered root-mean-square (RMS) difference
% between two variables E'
%
% [CRMSD] = CENTERED_RMS_DEV(PREDICTED,REFERENCE) calculates the
% centered root-mean-square (RMS) difference between two variables
% PREDICTED and REFERENCE (E'). The latter is calculated using the
% formula:
%
% (E')^2 = sum_(n=1)^N [(p_n - mean(p))(r_n - mean(r))]^2/N
%
% where p is the predicted values, r is the reference values, and
% N is the total number of values in p & r. Note that p & r must
% have the same number of values.
%
% Input:
% PREDICTED : predicted field
% REFERENCE : reference field
%
% Output:
% CRMSDIFF : centered root-mean-square (RMS) difference (E')^2
% Validate input args
narginchk(2,2);
% Check that dimensions of predicted and reference fields match
pdims= size(predicted);
rdims= size(reference);
if length(pdims) ~= length(rdims)
error(['Number of predicted and reference field dimensions do not' ...
' match.\n' ...
'length(predicted)= ' num2str(length(size(predicted))) ...
', length(reference)= ' num2str(length(size(reference))) ...
],class(pdims));
end
for i=1:length(pdims)
if pdims(i) ~= rdims(i)
error(['Predicted and reference field dimensions do not' ...
' match.\n' ...
'size(predicted)= ' num2str(size(predicted)) ...
', size(reference)= ' num2str(size(reference)) ...
],class(pdims));
end
end
% Calculate means
pmean = mean(predicted);
rmean = mean(reference);
% Calculate (E')^2
crmsd = ((predicted - pmean) - (reference - rmean)).^2;
crmsd = sum(crmsd)/length(predicted);
crmsd = sqrt(crmsd);
end