Перейти к содержанию
    

Как оформить вывод из функции по условию?

Например, в хелпе матлаба есть пример:

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, если не выполняется то возвращаемое значение должно иметь  старое значение.

В нижнем примере ругается на ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. И вызывать функцию, только если изменилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Со старым значением интересный вариант, спасибо, а штатных средств матлаба для  этой ситуации нет? Второе не понял, похоже совсем не то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, спасибо, я уже тоже к этому пришёл.

Только почему-то при объявлении n

 persistent n

она инициализируется комплексным значением 1-0i и тогда isempty(n) не срабатывает.

Причём иногда нормально инициализируется, а иногда значением 1-0i. Вот зараза...

Даже не знаю что делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 minutes ago, _sda said:

Только почему-то при объявлении n

 persistent n

она инициализируется комплексным значением 1-0i и тогда isempty(n) не срабатывает.

Причём иногда нормально инициализируется, а иногда значением 1-0i. Вот зараза...

Даже не знаю что делать.

Понять почему иногда - бывает иногда.

Попробовать clear вначале проекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, _4afc_ сказал:

Понять почему иногда - бывает иногда.

Попробовать clear вначале проекта.

Куда же без этого:

clear variables;

Но это в основном файле, все вызываемые функции в отдельном файле, поэтому там таких строчек нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, _sda said:

Куда же без этого:


clear variables;

Но это в основном файле, все вызываемые функции в отдельном файле, поэтому там таких строчек нет.

вы табличку на clear внизу почитайте когда удаляются persistent

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет под рукой матлаба, но:

function y = myIntegrand(x, old_x)
  	if x == old_x
  		y = old_x;
  	else
		y = sin(x).^3;
	end
end

Или это криво? Или я что-то не так понял?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, nice_vladi сказал:

Нет под рукой матлаба, но:


function y = myIntegrand(x, old_x)
  	if x == old_x
  		y = old_x;
  	else
		y = sin(x).^3;
	end
end

Или это криво? Или я что-то не так понял?)

  Это совсем не то. Посмотрите внимательно мой второй пример в топовом сообщении, увидите разницу. А вот persistent здесь бы очень хорошо вписался.

Если бы не глючил, редиска. Попробую завтра поиграться со структурой моих скриптов. У меня получилась длинная цепочка вложенных функций, может в этом засада.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Но мне такой вариант не подходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, что обнаружилось в ситуации с 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 создаётся то пустой (что правильно), то инициализированной комплексной константой(причём не вектором).

Не может же быть что размер иерархии ограничен? Никто не сталкивался с этим?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, _sda said:

А вот если сделать так:

то тогда с persistent начинается чехарда, при первом обращении к func3 переменная h создаётся то пустой (что правильно), то инициализированной комплексной константой(причём не вектором).

Не может же быть что размер иерархии ограничен? Никто не сталкивался с этим?

Сколько у вас .m файлов?

Какой Matlab?

Приложите .zip с тестовым глючным куском проекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за желание помочь. Но похоже что проблема разрешилась.

Установил более позднюю версию Матлаб, подёргал минут 10, криминала не заметил.

Будем надеяться что новых сюрпризов не появится.:dash2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...