Как сгенерировать функцию двух переменных без использования цикла?
-
21-09-2019 - |
Вопрос
Предположим, у меня есть функция y(t,x) = exp(-t)*sin(x)
В Matlab я определяю
t = [0: 0.5: 5];
x = [0: 0.1: 10*2*pi];
y = zeros(length(t), length(x)); % empty matrix init
Теперь, как мне определить матрицу y без использования какого-либо цикла, такой, что каждый элемент y(i,j) содержит значение искомой функции y в точке (t(i), x(j))
?Ниже показано, как я это сделал с помощью цикла for.
for i = 1:length(t)
y(i,:) = exp(-t(i)) .* sin(x);
end
Решение
Ваши входные векторы x
является 1xN
и t
является 1xM
, выходная матрица y
является MxN
.Чтобы векторизовать код как x
и t
должен иметь тот же размер, что и y
.
[x_,t_] = meshgrid(x,t);
y_ = exp(-t_) .* sin(x_);
Ваш пример представляет собой простой 2D-случай.Функция meshgrid()
работает и 3D.Иногда избежать петли не получится, в таких случаях, когда ваша петля может идти либо 1:N, либо 1:M, выбирайте самый короткий.Другая функция, которую я использую для подготовки вектора для векторизованного уравнения (умножение вектора на матрицу), — это diag()
.
Другие советы
нет необходимости в meshgrid
;просто используйте:
y = exp(-t(:)) * sin(x(:)'); %multiplies a column vector times a row vector.