Реализация суммирования последовательности в векторизованной форме вместо использования циклов в MATLAB

Когда я реализую суммирование ряда, например:

функция стоимости ошибки в квадрате

Я использую циклы, как показано ниже:

H=f(x);
C0=0;
for i=1:p
    C0=C0+((y(i) - H(i))^2);    %//H and Y are vectors of the same size. The function f(x) makes sure of this
end

C1=0;
for j=1:m
    C1=C1+(L(j)*(w(j).^2));
end

C=C0+C1

В предыдущем вопросе SO я спросил о другой серии суммирования, и кто-то упомянул полное избавление от циклов и использование матричных операций. Затем они предоставили мне «векторизованную» версию. Код, который они мне предоставили, работал отлично, но я не знаю, как они вывели его из уравнения суммирующего ряда, которое я предоставил.

В общем, как реализовать серию суммирования в MATLAB без циклов?

Какие общие правила я могу выучить, чтобы в будущем я мог реализовать любой ряд суммирования в векторизованной форме?

Спасибо!


person Blue7    schedule 04.03.2014    source источник
comment
H=f(x) кажется очень странным. Либо это должно быть H=f(i), либо вы можете вывести его вне цикла.   -  person Daniel    schedule 04.03.2014
comment
Да, это должно быть размещено вне цикла, я сейчас это изменю.   -  person Blue7    schedule 04.03.2014
comment
Хорошо, тогда первый цикл можно решить так же. Все, что вам нужно знать, это то, что вычитание всегда выполняется поэлементно (-).   -  person Daniel    schedule 05.03.2014


Ответы (1)


Я пропущу первый цикл, потому что я не уверен, как он должен работать (-> комментарий), и объясню векторизацию для второго цикла:

C1=0;
for j=1:m
    C1=C1+(L(j)*(w(j).^2));
end

Что делает код?

  1. возведение в квадрат каждого элемента w
  2. умножение результата на соответствующий элемент в L
  3. получить сумму результата.

Чтобы найти правильные операции, вы должны знать, что существуют матричные операции (*,^...) и поэлементные операции (.*,.^...). Если вы не знаете используемую операцию, введите doc *.

Первый шаг: возведение в квадрат поэлементно можно выполнить с помощью .^

w.^2

теперь умножьте на соответствующие элементы в L

L.*(w.^2)

и получить сумму результирующего вектора:

C1=sum(L.*(w.^2))
person Daniel    schedule 04.03.2014