2014-12-01 5 views
1

У меня вопрос (новичок) о матлабе. Я пробовал несколько вещей (например: записывать его в виде векторизованного цикла или записывать его как «if-loop» и вычислять сумму явно), но я продолжаю делать ошибки, и поэтому я продолжаю получать ошибки в matlab.Двойное суммирование в matlab

Я должен максимизировать следующую функцию:

\sum_{i=1}^{L} \sum_{k=1}^K (r_k^3 t_{ik}) 

с L, К, R_k известно. Кроме того, t_ik - переменные desicion, поэтому они имеют значения в {0,1}.

Любая помощь будет оценена по достоинству.

ответ

0

Вы описываете двойной цикл:

result=0; 
for i=1:L 
    for k=1:K 
     result=r(K)^3*t(i*k)+result ; 
    end 
end 

Однако я считаю, что ваша проблема не связана с MATLAB, вы просто не знаете, как конвертировать из математики в коде.

+1

Спасибо, но, похоже, я неправильно сформулировал свой вопрос ... Тем не менее, я только нашел решение моей реальной проблемы, но поскольку это правильный ответ на вопрос, я буду отмечать его как правильный. Приносим извинения за неудобства. – Riley

-2

Если кто приходит смотреть, правильный способ сделать это

sum(sum(a)) 

где а вашу матрицу. Это масштабируется и для большего количества измерений.

+0

Хотя это технически правильно, это не относится к вопросу. Существует три отдельных вектора, которые требуют суммирования, а не матрицы. – rayryeng

+0

Затем объедините их в одну матрицу и используйте мой метод. Похоже, ваша проблема очень векционируема, в будущем, если вы опубликуете код, который вы попробовали, вы получите ответы, нацеленные больше на вашу ситуацию. –

+0

Вы не можете просто объединить векторы вместе и применить 'sum' к строкам. Он не рассчитает правильные результаты. См. Мой ответ. – rayryeng

3

Если вы ищете более векторный результат, вы можете создать продукты в сумме по bsxfun, затем sum по всей матрице, чтобы получить ответ (à la Adam Farabaugh). Ваше уравнение в виде LaTeX выглядит следующим образом (для меня легче читать):

Похоже t это 2D матрица, а r вектор. С приведенным выше утверждением, похоже, вы берете каждую строку t и умножаете эту строку поэтапно на r с каждым элементом в r, поднятом до третьего уровня. Вы повторяете это для всех строк в t, затем суммируйте результаты. Предполагая, что r есть вектор-строка, а количество столбцов в t спичек количество элементов в r, сделать что-то вроде этого:

prods = bsxfun(@times, r.^3, t); 
result = sum(prods(:)); 

Первый оператор будет принимать r и создает матрицу, где каждая строка этого матрицей будет копия r, поднятая до третьей мощности. Это является следствием bsxfun, что является коротким для Binary Singleton EXPansion FUNTION. В двух словах она копирует все размеры (размеры) переменной, которая имеет меньшие размеры между ними, и реплицирует элементы так, чтобы обе переменные соответствовали размеру.

Затем мы берем эту новую матрицу и выполняем умножение по элементам с матрицей t. Как только мы это сделаем, мы просто суммируем по всем элементам в этой матрице. Вы можете вложить sum звонки, как то, что предлагает Адам, но если вы действительно хотите сделать его более общим, вы можете просто создать матрицу так, чтобы это был один вектор, а затем применить sum на этом одиночном векторе.

Смежные вопросы