#matlab #function
#matlab #функция
Вопрос:
Я ищу простой способ закодировать функцию в matlab, которая принимает вектор (массив) в качестве входных данных и выдает вектор (массив) в качестве выходных данных.
Если входные и выходные массивы небольшие, их легко кодировать с помощью дескрипторов функций:
f=@(u)[u(1),u(2)]
Этот подход не работает для меня для больших векторов, поскольку он не позволяет мне указывать каждый компонент выходного массива в цикле.
Я нашел способ заставить ее работать, но это очень некрасиво: объединение всей функции в виде строки, а затем преобразование ее в функцию:
str2fun(strcat('@(u)[u(',int2str(1),'), u(',int2str(2),')]'))
Пример:
n=100; input=zeros(1,n);
str=strcat('@(u)[cos(u(',int2str(1),')),');
for i=2:n-1
str=strcat(str,'cos(u(',int2str(i),'))^',int2str(i),',');
end
str=strcat(str,'cos(u(',int2str(n),'))^',int2str(n),']');
f=str2func(str);
f(input)
вывод представляет собой 100-элементный вектор единиц.
Код генерирует дескриптор функции, который принимает вектор длиной n и возвращает вектор длиной n. Важно, чтобы я мог контролировать, от каких элементов ввода должен зависеть каждый элемент вывода.
Этот способ построения функции кажется действительно уродливым и сложным, я хотел бы знать, есть ли лучший способ кодирования таких функций в matlab?
Комментарии:
1. [1,1,1,1,1,1, …,1], что дает пример, если он выполняется
2. Я думаю, что это минимальный рабочий пример. Пример работает и для «более длинных» функций, но чем сложнее математическая формула для вычисления подстановки, тем менее читаемым и более подверженным ошибкам становится этот способ кодирования. .
3. Вам нужно прочитать эту страницу документации .
Ответ №1:
Ваш код может быть векторизован, как показано ниже:
f = @(u) cos(u).^(1:numel(u));