Интегральная функция Matlab и дескрипторы функций в цикле

'Outliers.m' вызывается из файла .m более высокого уровня. Все переменные определены в файле более высокого уровня и установлены как глобальные для доступа с помощью Outliers.m. Целью кода является выявление выбросов с использованием критерия Шовене, и для этого я должен вычислить интеграл распределения Гаусса, используя функцию интеграла и дескрипторы функций. Код работает и дает разумные значения, когда я ввожу определенные переменные в качестве теста, но я не могу заставить его работать в цикле. Мой набор данных состоит из 7 отдельных образцов, каждый 1x30, и все они должны быть проанализированы. У меня были различные ошибки, я прочитал руководство по интегральным и функциональным дескрипторам, но, похоже, не могу найти решение... Любая помощь или руководство будут очень признательны.... Вот мой код:

n = 7
for x = 1:n
    for y = 1:30
    z(x,y) = abs((cc(x,y) - mastercc(1,y))/masterccstd(1,y));
    xmax(x,y) = mastercc(1,y)+z(x,y)*masterccstd(1,y);
    xmin(x,y) = mastercc(1,y)-z(x,y)*masterccstd(1,y);
    p(x,y) = 1/(masterccstd(1,y)*(sqrt(2*pi)));

    fun(x,y)= @(x,y,z) (exp(-1/2)*z(x,y).^2);
    q(x,y) = integral(fun(x,y),xmin(x,y),xmax(x,y),'ArrayValued',true);

    pq(x,y) = p(x,y)*q(x,y); % probability
    value(x,y) = n*(1/pq(x,y));
    count(x,y) = logical(value(x,y) <0.5);
    badbins(x)=sum(count(x,:));
    end
end

person GingerMonster    schedule 25.10.2013    source источник
comment
Какой у Вас вопрос? Если вы столкнулись с сообщением об ошибке, укажите точное сообщение, в какой строке оно появляется, и опишите соответствующие переменные.   -  person Dennis Jaheruddin    schedule 25.10.2013
comment
Привет Денис - извините, забыл поставить ошибку! Вот оно: Ошибка при использовании @(x,y,z)(exp(-1/2).*z(x,y).^2) Недостаточно входных аргументов. Ошибка в выбросах (строка 30) q(x,y) = integer(fun(x,y),xmin(x,y),xmax(x,y),'ArrayValued',true); Ошибка в выбросах mastercal_diameters (строка 46)   -  person GingerMonster    schedule 25.10.2013
comment
Почему у вас включена опция 'ArrayValued' и установлена ​​true? Из того, что я вижу, вывод вашей функции fun является скаляром, не так ли? Но из вашего комментария ниже похоже, что вы даже не используете этот код. Правильно ли вы определяете, передаете и вызываете свой дескриптор функции?: fun = @(z)exp(-1/2)*z.^2; q(x,y) = integral(fun(z(x,y)),xmin(x,y),xmax(x,y));.   -  person horchler    schedule 25.10.2013
comment
@horchler - результат должен быть двойным 7x30, так как мне нужна вероятность каждой точки данных из двойного 7x30, называемого «cc». Я запустил приведенный выше исходный код, но заменил предложенные вами 2 строки кода и получил новую ошибку: Ошибка при использовании интеграла (строка 83) Первый входной аргумент должен быть дескриптором функции. Ошибка в выбросах (строка 30) q(x,y) = Integral(fun(z(x,y)),xmin(x,y),xmax(x,y)); Интересно, что 'fun' ДЕЙСТВИТЕЛЬНО отображается как дескриптор функции в рабочей области (подтверждено: isa(fun,'function_handle') = 1)   -  person GingerMonster    schedule 25.10.2013


Ответы (2)


Похоже, ваша ошибка вызвана неправильным определением функции.

Если вы попробуете это так, это должно сработать:

fun = @(x,y,z) (exp(-1/2)*z(x,y).^2)

Теперь его можно назвать, например, так:

fun(1,2,magic(4))
person Dennis Jaheruddin    schedule 25.10.2013
comment
Я заменил дескриптор функции на: fun = @(x,y,z) (exp(-1/2)*z(x,y).^2); и интегральная функция с: q(x,y) = Integer(fun(x,y,z),xmin(x,y),xmax(x,y),'ArrayValued',true); И вылезла та же ошибка..... - person GingerMonster; 25.10.2013
comment
@GingerMonster Пожалуйста, запустите его с dbstop if error и опишите, какие переменные вы пытаетесь ввести в строке, где код останавливается. - person Dennis Jaheruddin; 25.10.2013
comment
Ошибка останавливается на строке «internal» и возвращается к дескриптору функции «fun». Переменные в этой точке: x = 1 y = 1 z = 0,2502 xmax = 1,9428 xmin = 1,9104 Если поможет, вот тот же код, но без циклов, но переменные заменены константами: n = 7; г = абс (4,3794 - 1)/1; хмакс = 1+z*1; хмин = 1-z*1; р = 1/(1*2,5066); весело = @(z) exp(-1/2*z.^2); q = интеграл (удовольствие, xmin, xmax); рд = р*д; значение = 6*1/пк; количество = логическое (значение ‹0,5); бадбины = сумма (количество); - person GingerMonster; 25.10.2013
comment
@GingerMonster Функция, которую вы публикуете в этом комментарии, у меня работает без проблем. Если это не так, перезапустите Matlab и повторите попытку. -- Я думаю, вы просите integral сделать что-то, чего он не может. Пожалуйста, попробуйте пройти help integral, затем начните с небольшой проблемы и начните с нее. - person Dennis Jaheruddin; 25.10.2013
comment
просто чтобы подтвердить, повторите: код, который вы можете запустить без проблем, был ли это код с циклом или без него? Я перезапустил Matlab и не радуюсь (работает в цикле). Я уже прочитал справку (несколько раз!) по Integral и FunctionHandles. Спасибо за вашу помощь и время до сих пор - надеюсь, решение появится в ближайшее время! - person GingerMonster; 25.10.2013

Решение проблемы цикла, любезно предоставлено Андреем Бобровым через Matlab Central, ссылка ниже:

http://www.mathworks.com/matlabcentral/answers/103958#comment_177000

NB: обратите внимание, что код не является полным для цели, которую я объяснил в описании проблемы, но он устраняет ошибку цикла.

person GingerMonster    schedule 29.10.2013