MATLAB: самый быстрый способ сделать среднеквадратичную ошибку между вектором и массивом векторов - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть вопрос относительно самого быстрого способа вычисления RMSE между одним вектором и массивом векторов. В частности, у меня есть вектор A, представляющий точку, и я хотел бы найти индекс в списке точек B, к которым A ближе всего. Прямо сейчас я использую:

    tempmat = bsxfun(@minus,A,B);
    tempmat1 = sqrt(sum(tempmat.^2,2);
    index = find(tempmat1 == min(tempmat1));

это займет около 0,058 секунд для расчета индекса. Есть ли в MATLAB более быстрый способ сделать это? Я выполнял эти вычисления буквально миллионы раз.

Большое спасибо за чтение, Джо

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011
tempmat = bsxfun(@minus,A,B);
tmpmat1 = sum(tempmat.^2,2);
[m,index] = min(tempmat1);
m = sqrt(m); %# optional, only if you need the actual numerical value

Это позволяет избежать вычисления sqrt для всего массива, поскольку минимум квадратов разностей будет иметь одинаковый индекс.Он также использует второй вывод min, чтобы избежать второго прохода find.

1 голос
/ 30 ноября 2011

Вы, вероятно, обнаружите, что

tempmat = A - B(ones(1, size(A,1)), :)

быстрее, чем версия bsxfun, если только размер (A, 1) не слишком велик.

Предполагается, что A является вашиммассив и B ваш вектор.Расчет RSS подразумевает, что у вас есть векторы строк.

Кроме того, я полагаю, вы знаете, что вы рассчитываете RSS, а не RMS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...