Предположим, что у меня есть функция 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 (я, j) содержит значение желаемой функции y в (t(i), x(j))
? Ниже то, как я сделал это с помощью для цикла.
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_);
Ваш пример - простой двумерный случай. Функция meshgrid()
работает также в 3D. Иногда не удается избежать цикла, в таких случаях, когда цикл может идти как 1:N, так и 1:M, выбираем самый короткий. Другой функцией, которую я использую для подготовки вектора к векторизованному уравнению (умножение вектора на матрицу x), является diag()
.
Those might be helpful:
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/meshgrid.html
http://www.mathworks.com/company/newsletters/digest/sept00/meshgrid.html
Good Luck.
нет необходимости в meshgrid
; просто используйте:
y = exp(-t(:)) * sin(x(:)'); %multiplies a column vector times a row vector.