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

Предположим, что у меня есть функция 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
7
задан Shai 8 May 2013 в 06:22
поделиться

3 ответа

Ваши входные векторы 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().

.
12
ответ дан 6 December 2019 в 09:20
поделиться

нет необходимости в meshgrid; просто используйте:

y = exp(-t(:)) * sin(x(:)');    %multiplies a column vector times a row vector.
6
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: