Линейное программирование fmincon. Почему код не работает?

Я хочу найти максимальное значение, используя эту функцию:

Function f = myfun(a)
    a = {'a1';'a2';'a3';'a4'};
    x = rand(4,5);
    S = -x.*a; 
    SS = sum(S); 
    [~,ix] = sort(SS); 
    R = rand(1,5)
    SR = R(ix); 
    f = sum(SR(1:10));
    Aeq=ones(4,1); 
    beq=1;  
    a0=[.25 .25 .25 .25]';  
    [a,f] = fmincon(@myfun,a0,[],[],Aeq,beq);    
end

Код выдает ошибку:

ошибка: неопределенная функция или метод «mtimes» для входных аргументов типа «ячейка»

Ты знаешь почему?


person user1205030    schedule 19.02.2012    source источник
comment
Каким образом это не работает?   -  person High Performance Mark    schedule 19.02.2012
comment
например, он просит меня определить «а»   -  person user1205030    schedule 19.02.2012
comment
ошибка: Неопределенная функция или метод «mtimes» для входных аргументов типа «ячейка».   -  person user1205030    schedule 19.02.2012


Ответы (1)


Как показано, ваша функция недействительна для Matlab. Использование «F» в «Function» вместо «f» вызовет предупреждение, но наличие «end» в конце определения функции является синтаксической ошибкой. Исправьте эти ошибки, затем запустите функцию в режиме отладки. Ваша следующая проблема в том, что

S = -x.*a;

не определено, где правая сторона (в данном случае 'a') - это массив ячеек, который был сделан вашим предыдущим объявлением. Также очень странно, что вы ожидаете (в первой строке) «a» как аргумент функции, но в l2 определяете его как массив ячеек, содержащий 4 строки.

person High Performance Mark    schedule 19.02.2012
comment
Это хорошо подводит итог, хотя даже если он убедится, что a является вектором, а не массивом ячеек, эта строка все равно будет иметь ошибку измерения. Чтобы делать то, что (я думаю) он хочет, это должно быть S = bsxfun(@times, -x, a) - person prototoast; 19.02.2012
comment
Как я могу определить «а»? Фактически S вычисляется следующим образом: s1 = -x(1,:)*a1; s2 = -x(2,:)*a2.....s4 = -x(4,:)*a4. - person user1205030; 19.02.2012
comment
@ user1205030: Боюсь, вы пытаетесь бежать раньше, чем ходить. Я предлагаю вам (а) написать последовательность команд в командном окне Matlab, пока они не будут делать то, что вы хотите, затем (б) прочитать начальную документацию о том, как писать функции, затем (в) отредактировать последовательность команд в допустимой функции. определение. - person High Performance Mark; 19.02.2012
comment
@ user1205030: удачи в том, что кажется тебе очень сложной ситуацией. - person High Performance Mark; 19.02.2012
comment
@Знак высокой производительности. 'функция ... конец' является допустимым синтаксисом Matlab. См. mathworks.com/help/techdoc/ref/function.html. : Вы можете завершить любой тип функции с помощью оператора end, но это не обязательно... - person Kavka; 19.02.2012
comment
@Kavka: да, вы правы, синтаксическая ошибка, возникающая из-за «конца», генерируется иначе. - person High Performance Mark; 19.02.2012