_sda 0 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба Например, в хелпе матлаба есть пример: function y = myIntegrand(x) y = sin(x).^3; end function y = myIntegrand(x) if rem(x,5) == 0 y = sin(x).^3; end end А как быть если переменная y изменяется не при каждом обращении, а по некому условию? Если условие выполняется то на выход нужно отправить новое значение y, если не выполняется то возвращаемое значение должно иметь старое значение. В нижнем примере ругается на ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба 2 minutes ago, _sda said: Например, в хелпе матлаба есть пример: function y = myIntegrand(x) y = sin(x).^3; end function y = myIntegrand(x) if rem(x,5) == 0 y = sin(x).^3; end end А как быть если переменная y изменяется не при каждом обращении, а по некому условию? Если условие выполняется то на выход нужно отправить новое значение y, если не выполняется то на выход должно отправляться старое значение. В нижнем примере ругается на ошибку. Полагаю, надо в функцию также передавать старое значение? Либо до вызова функции проверять, изменилось ли y. И вызывать функцию, только если изменилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба Со старым значением интересный вариант, спасибо, а штатных средств матлаба для этой ситуации нет? Второе не понял, похоже совсем не то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба 52 minutes ago, _sda said: Если условие выполняется то на выход нужно отправить новое значение y, если не выполняется то возвращаемое значение должно иметь старое значение. Использовать переменную y как persistent function myFun() persistent n if isempty(n) n = 0; end n = n+1 end myFun myFun myFun clear myFun myFun myFun n = 1 n = 2 n = 3 n = 1 n = 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба Да, спасибо, я уже тоже к этому пришёл. Только почему-то при объявлении n persistent n она инициализируется комплексным значением 1-0i и тогда isempty(n) не срабатывает. Причём иногда нормально инициализируется, а иногда значением 1-0i. Вот зараза... Даже не знаю что делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба 34 minutes ago, _sda said: Только почему-то при объявлении n persistent n она инициализируется комплексным значением 1-0i и тогда isempty(n) не срабатывает. Причём иногда нормально инициализируется, а иногда значением 1-0i. Вот зараза... Даже не знаю что делать. Понять почему иногда - бывает иногда. Попробовать clear вначале проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба 12 минут назад, _4afc_ сказал: Понять почему иногда - бывает иногда. Попробовать clear вначале проекта. Куда же без этого: clear variables; Но это в основном файле, все вызываемые функции в отдельном файле, поэтому там таких строчек нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба 32 minutes ago, _sda said: Куда же без этого: clear variables; Но это в основном файле, все вызываемые функции в отдельном файле, поэтому там таких строчек нет. вы табличку на clear внизу почитайте когда удаляются persistent Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба Нет под рукой матлаба, но: function y = myIntegrand(x, old_x) if x == old_x y = old_x; else y = sin(x).^3; end end Или это криво? Или я что-то не так понял?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 5 апреля, 2022 Опубликовано 5 апреля, 2022 · Жалоба 2 часа назад, nice_vladi сказал: Нет под рукой матлаба, но: function y = myIntegrand(x, old_x) if x == old_x y = old_x; else y = sin(x).^3; end end Или это криво? Или я что-то не так понял?) Это совсем не то. Посмотрите внимательно мой второй пример в топовом сообщении, увидите разницу. А вот persistent здесь бы очень хорошо вписался. Если бы не глючил, редиска. Попробую завтра поиграться со структурой моих скриптов. У меня получилась длинная цепочка вложенных функций, может в этом засада. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 6 апреля, 2022 Опубликовано 6 апреля, 2022 · Жалоба 16 часов назад, nice_vladi сказал: Нет под рукой матлаба, но: function y = myIntegrand(x, old_x) if x == old_x y = old_x; else y = sin(x).^3; end end Или это криво? Или я что-то не так понял?) Вашу функцию применительно к своему примеру я написал бы так: function y = myIntegrand(x,y_old) if rem(x,5) == 0 y = sin(x).^3; else y = y_old; end end Но мне такой вариант не подходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 6 апреля, 2022 Опубликовано 6 апреля, 2022 · Жалоба Коллеги, что обнаружилось в ситуации с persistent. Если иерархию сделать так: function func1() func2() end function func2() persistent h if isempty(h) h = [zeros(1,11) 1 zeros(1,11)]'; end end То и persistent и isempty прекрасно себя ведут, никаких замечаний не возникает при довольно долгом тестировании. А вот если сделать так: function func1() func2() end function func2() func3() end function func3() persistent h if isempty(h) h = [zeros(1,11) 1 zeros(1,11)]'; end end то тогда с persistent начинается чехарда, при первом обращении к func3 переменная h создаётся то пустой (что правильно), то инициализированной комплексной константой(причём не вектором). Не может же быть что размер иерархии ограничен? Никто не сталкивался с этим? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 6 апреля, 2022 Опубликовано 6 апреля, 2022 · Жалоба 20 minutes ago, _sda said: А вот если сделать так: то тогда с persistent начинается чехарда, при первом обращении к func3 переменная h создаётся то пустой (что правильно), то инициализированной комплексной константой(причём не вектором). Не может же быть что размер иерархии ограничен? Никто не сталкивался с этим? Сколько у вас .m файлов? Какой Matlab? Приложите .zip с тестовым глючным куском проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 6 апреля, 2022 Опубликовано 6 апреля, 2022 · Жалоба Спасибо за желание помочь. Но похоже что проблема разрешилась. Установил более позднюю версию Матлаб, подёргал минут 10, криминала не заметил. Будем надеяться что новых сюрпризов не появится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться