matlab кодирование n-мерной функции

#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));