Вес применяется дважды. Посмотрите на эту строку:
res = (obs - pred) .* w;
Потом вы возводите res в квадрат, так что в числителе получается w^2, а в знаменателе только sum(w). Когда все веса равны единице, разницы нет, поэтому всё выглядит нормально. Ваш цикл на Fortran наверняка делает w(i)*r(i)**2.
Исправление: сначала возвести в квадрат, потом взвесить.
res = obs - pred;
s = sqrt(sum(w .* res.^2) / sum(w));
Проверьте ещё размерности. Если obs — столбец, а w — строка, то .* и - расширяются до матрицы, и никакой ошибки не будет. Приведите все три к одной ориентации (w(:), obs(:), pred(:)).
mean(wss) от скаляра ничего не делает. Для нескольких каналов сначала сделайте sum(..., 1) по каждому столбцу, а потом решайте, как усреднять.
Документация по sum с аргументом размерности: https://www.mathworks.com/help/matlab/ref/sum.html
Переведено с английского·Показать оригиналWeight is applied twice. Look at this line:
res = (obs - pred) .* w;
Then you square res, so numerator gets w^2, but denominator is sum(w) only. With all ones no difference, so it looks fine. Your Fortran loop surely does w(i)*r(i)**2.
Fix: square first, then weight.
res = obs - pred;
s = sqrt(sum(w .* res.^2) / sum(w));
Check shapes too. If obs is a column and w is a row, .* and - broadcast to a matrix, and no error is shown. Make all three the same orientation (w(:), obs(:), pred(:)).
mean(wss) of a scalar does nothing. For several channels, do sum(..., 1) per column first, then decide how to average.
Docs for sum with dimension argument: https://www.mathworks.com/help/matlab/ref/sum.html