2015-10-08 2 views
-2

У меня есть Matlab-функция, которая возвращает tutorial_main(xalpha) мне struc элемент 2 записей (из-за авторские права, я не могу предоставить вам функции :()Вызов функции в сценарии и командной строке получает другой результат

Всякий раз, когда я вызываю функцию из командной строки с fit_t = []; alpha = 0.01; fit_t = [fit_t tutorial_main(alpha)];

это работает просто отлично

Всякий раз, когда я делаю то же самое в сценарии внутри цикла, я получаю сообщение об ошибке:.

fit_t = [] 
for alpha = 0.01:0.01:1 
    tic; 
    fit_t = [fit_t tutorial_main(alpha)]; 
    time = toc; 
end 

Ошибка:

Improper assignment with rectangular empty matrix. 

Error in tutorial_main (line 286) 
    ML(1) = myvect(p{1}(max(marglik{1})==marglik{1})); 

Error in ass5 (line 14) 
    fit_t = [fit_t tutorial_main(alpha)]; 

и иногда она работает в течение нескольких итераций, но после того, как третий дает мне

In an assignment A(I) = B, the number of elements in B and I must be the 

Error in tutorial_main (line 286) 
    ML(1) = myvect(p{1}(max(marglik{1})==marglik{1})); 

Error in ass5 (line 14) 
    fit_t = [fit_t tutorial_main(alpha)];same. 

Я действительно не понимаю, почему я получаю сообщение об ошибке. Функция в обоих случаях должна быть названа одинаковым образом. Запуск clear all до этого ничего не меняет.

Теперь Вейрдест часть: Когда я поставил точку останова в time = toc, и по-прежнему вручную после каждого цикла, я не получаю сообщение об ошибке. Удаление tic/toc не помогает. Редактировать: Хорошо, иногда я также получаю сообщение об ошибке с точками останова.

+0

Без примера кода, который дублирует ваша проблема. Я не уверен, что вы ожидаете от кого-либо. Используйте ['dbstop if error'] (http://www.mathworks.com/help/matlab/ref/dbstop.html#buzezti-1), чтобы оценить ваше рабочее пространство при ошибке. Я также считаю, что ['max'] (http://www.mathworks.com/help/matlab/ref/max.html) необязательно возвращает одно значение. – excaza

+0

Ну, как я называю функцию по существу с теми же командами, я думал, что должно быть что-то вообще неправильное? Не следует ли возвращать функцию при вызове с теми же значениями? – skjerns

+0

Он не работает с одинаковыми значениями. Ваша 'alpha' меняется в цикле. – excaza

ответ

2

Вы уверены, что ваша функция возвращает скаляр или хотя бы вектор строки?

Разница заключается в том, что fit_t = [fit_t retval]; всегда хорошо, если изначально fit_t=[], но если он уже имеет значение вектора скалярную/строки, то вы столкнетесь с проблемами, если retval (возвращаемое значение) не является вектором скалярной/строки.

Ваша ошибка говоря In an assignment A(I) = B, the... также предлагает следующее: ваша правая сторона, вероятно, вектор ML(1) = myvect()..., скорее всего marglik{1} не имеет единственный максимум, поэтому max(marglik{1})==marglik{1} возвращает логический вектор с несколькими не-нулей, так p{1}(max...) является вектор, который сталкивается с ML(1) с левой стороны. Вам нужно выбрать одно значение из значений в max(marglik{1})==marglik{1}, если их несколько.

(Это, или волшебные феи использовали неправильный вид бинарной пыли на вашей секретной функции. Действительно трудно отлаживать черный ящик, если мы даже не знаем, что он выводит.)

+0

Да, но моя проблема в том, что функция ALWAYS отлично работает при запуске из командной строки и почти всегда терпит неудачу при запуске внутри скрипта, хотя вызов имеет те же значения. Как это возможно? – skjerns

+0

@skjerns Вы пытались вручную воспроизвести цикл? Как в 'fit_t = []; alpha = 0,01; fit_t = [fit_t tutorial_main (alpha)]; альфа = 0,02; fit_t = [fit_t tutorial_main (alpha)]; 'и т. д. вплоть до' alpha = 1'? По пути вы должны столкнуться с вашими ошибками. –

+0

Действительно, если я запускаю код вручную в консоли, он работает без ошибок. Как только я делаю это с помощью цикла, он перестает работать. – skjerns

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