2014-02-08 7 views
0

Я пытаюсь выполнить некоторую базовую арифметику в цикле for в MatLab.Унарная операция с использованием циклов в Matlab

В принципе, я хочу копировать и управлять каждым элементом по одному. Сначала я хочу вычесть 3.6: testDataMean из каждого элемента, поднять каждый элемент до 2, а затем суммировать каждую переменную. Окончательно разделите переменную s на 5 (sizeOfTestData)

Это должно рассчитать примерно ~ 1,05.

testData переменная является 1x5 вектор, содержащий число 3, 4, 2, 5, 4

s = 0; 

for k = 1:sizeTestData 
    p = testData(k); 
    q = p - testDataMean; 
    r = q^2; 
    s = s + r; 
    s/5; 

end 

Этот цикл фактически выдает ошибку на последней строке s = s + r. Я знаю, что могу использовать функцию sum в большинстве случаев при работе на векторах того же размера, но в контексте цикла for я не уверен.

+0

Что такое Ошибка? «Матричные размеры должны совпадать»? –

+0

Извините, это говорит: «Неопределенная функция или переменная» – user1574598

+0

Ну, у вас есть свой ответ. Поместите 's = 0' перед контуром. –

ответ

3

Отметьте, что sum(s)/numel(s) по определению то же, что и mean(s).

Петля свободный подход:

testData = [3, 4, 2, 5, 4] 
q = testData - mean(testData); 
s = mean(q.^2); 
s = 1.0400 

Один лайнер:

s = mean((testData-mean(testData)).^2) 
s = 1.0400 

И ваш первоначальный подход:

(После исправления ошибки)

testData = [3, 4, 2, 5, 4] 

s = 0; 
sizeTestData = length(testData); 
testDataMean = mean(testData); 

for k = 1:sizeTestData 
    p = testData(k); 
    q = p - testDataMean; 
    r = q^2; 
    s = s + r; 
end 
s = s/numel(s); 
s = 1.0400 
+0

Спасибо за ответ. Извините, я пропустил жизненно важный момент в конце, который должен был разделить суммированную переменную '' 'на' 5'. Я отредактировал свое оригинальное сообщение. – user1574598

+0

Спасибо, я дам ваше решение попробовать, но да, это то, что я хотел. Я просто занимаюсь концепцией RMSE (среднеквадратичная ошибка). – user1574598

+0

@ user1574598: Программирование Matlab эффективно связано с тем, что избегает циклов, когда это возможно. Таким образом, однострочный слой Даниэля - это не просто один, а * способ Matlab для вычисления RMSE. За исключением того, что это можно сделать еще короче: 's = var (testData, 1)' ;-) –