2014-12-11 5 views
2

Как я могу получить длину y?Как получить количество аргументов ввода анонимной функции

>> s=10; r=28; b=8/3; 
>> f = @(t,y) [-s*y(1)+s*y(2); -y(1)*y(3)+r*y(1)-y(2); y(1)*y(2)-b*y(3)]; 

В приведенном выше примере длина 3. Кроме того, поскольку t является единственной независимой переменной, длина y может быть найдена по длине функции f, то есть 4.

EDIT

Я хочу написать систему дифференциальных уравнений решатель как ode45() функции. Вот пример

[t y] = ode45(f,[0 1],[1 0 0]); 
+0

Не понимайте. msgstr "количество аргументов ввода анонимной функции". f имеет два входных аргумента, t и y. Как вы получили 3 или 4? – Marcin

+0

Сам 'y' представляет собой массив из трех аргументов' y (1) ',' y (2) 'и' y (3) '. – Dante

+0

Используется numel (y) или размер (y). – Marcin

ответ

1

Я все еще не совсем понимаю. Но из небольшого числа, которое я делаю, вы не видите, что вы хотите заглянуть внутрь функции f и искать y (1), y (2) или y (3), чтобы увидеть, сколько элементов у у? Если это так, вы можете сделать это следующим образом:

f = @(t,y) [-s*y(1)+s*y(2); -y(1)*y(3)+r*y(1)-y(2); y(1)*y(2)-b*y(3)];   
matchStr = regexp(func2str(f),'y\(\d\)','match'); 
numel(unique(matchStr)) 

Это дает: 3

В основном то, что он делает это, чтобы сделать п в строку, а затем ищет y(\d) в этой строке.

И только в случае, если вы хотите иметь количество анонимных аргументов входных функций, чем вы можете использовать:

nargin(f) 

Это дает: 2 (потому что у вас есть т и у в качестве вклада в F)

+0

Спасибо. Ваш ответ правильный, но он не выглядит красивым и не работает, если пользователь использует 'x' вместо' y'. Я не думаю, что Matlab использует это в своих функциях дифференциальных уравнений, таких как 'ode45()'. Должен быть лучший способ. – Dante

+2

Так почему бы не проверить, как ode45 это делает? просто отредактируйте ode45, и вы увидите исходный код. Может быть, это предоставит некоторые андерсеры. – Marcin

+0

@ user96402 просто проверьте для '(\ d)' без 'y', если вы не уверены, будет ли он называться' y', или вы можете сначала проверить, что такое имя входного параметра, прежде чем создавать регулярное выражение. – Hoki

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