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

StackOverflow https://stackoverflow.com/questions/1961978

  •  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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top