2009-12-25 5 views
7

Пусть у меня есть функция у (т, х) = ехр (-t) * sin (х)Как сгенерировать функцию двух переменных без использования какого-либо цикла?

В Matlab, я определяю

t = [0: 0.5: 5]; 
x = [0: 0.1: 10*2*pi]; 
y = zeros(length(t), length(x)); % empty matrix init 

Теперь, как мне определить матрицу у без используя любой цикл, так что каждый элемент y (i, j) содержит значение искомой функции y при (t(i), x(j))? Ниже показано, как я это сделал, используя цикл for.

for i = 1:length(t) 
    y(i,:) = exp(-t(i)) .* sin(x); 
end 
+0

Не уверен, что вы можете - это цикл, на котором нужно долго бежать, или почему вы хотите? –

+0

В этом простом примере петля не является проблемой. Но я хочу научиться делать это без цикла для действительно больших векторов! – Aamir

ответ

12

Ваш вклад векторов x является 1xNt и является 1xM, выходная матрица y является MxN. Для векторизации кода оба x и t должны иметь тот же размер, что и y.

[x_,t_] = meshgrid(x,t); 
y_ = exp(-t_) .* sin(x_); 

Ваш пример - простой 2D-футляр. Функция meshgrid() работает также 3D. Иногда вы не можете избежать цикла, в таких случаях, когда ваш цикл может идти либо 1: N, либо 1: M, выберите самый короткий. Другая функция, которую я использую для подготовки вектора для векторизованного уравнения (векторное умножение матрицы x), равна diag().

+0

voila! спасибо за такое элегантное решение. – Aamir

6

не требуется meshgrid; просто используйте:

y = exp(-t(:)) * sin(x(:)'); %multiplies a column vector times a row vector. 
+0

+1 для простого и элегантного решения матричного умножения. – gnovice