2012-02-19 2 views
1

Я хочу, чтобы найти максимальное значение с помощью этой функции:Линейное программирование 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 

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

error: Undefined function or method 'mtimes' for input arguments of type 'cell'

Вы знаете, почему?

+0

Каким образом это не работает? –

+0

, например, он просит меня определить 'a' – user1205030

+0

error: Неопределенная функция или метод 'mtimes' для входных аргументов типа 'cell'. – user1205030

ответ

1

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

S = -x.*a; 

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

+1

Это суммирует все хорошо, хотя даже если он делает, что a - это вектор, а не массив ячеек, эта строка будет по-прежнему иметь ошибку измерения. Чтобы сделать то, что (я думаю), он хочет, чтобы это делалось, это должно быть S = bsxfun (@times, -x, a) – prototoast

+0

Как определить 'a'? S фактически вычисляется так: s1 = -x (1,:) * a1; s2 = -x (2,:) * a2 ..... s4 = -x (4,:) * a4. – user1205030

+3

@ user1205030: Я боюсь, что вы пытаетесь бежать, прежде чем вы сможете ходить. Я предлагаю вам (а) записать последовательность команд в командное окно Matlab, пока они не сделают то, что вам нужно. (B) прочитайте начальную документацию о том, как писать функции, затем (c) отредактируйте последовательность команд в действительную функцию определение. –