2009-12-25 55 views
7

假設我有一個函數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)包含在(t(i), x(j))處的期望函數y的值。以下是我如何使用for循環做到的。

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

不知道你可以 - 循環需要很長時間才能運行,或者你爲什麼想要? – 2009-12-25 21:42:39

+0

在這個簡單的例子中,循環不是一個問題。但我想學習如何在沒有循環的情況下實現真正大型的矢量! – Aamir 2009-12-25 22:18:48

回答

12

你的輸入矢量x1xNt1xM,輸出矩陣yMxN。要向量化代碼,xt必須與y具有相同的尺寸。

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

你的例子是一個簡單的2D情況。功能meshgrid()也適用於3D。有時你無法避免循環,在這種情況下,當循環可以選擇1:N或1:M時,選擇最短的一個。我用來爲矢量化方程(矢量x矩陣乘法)準備矢量的另一個函數是diag()

+0

瞧!感謝這樣一個優雅的解決方案。 – Aamir 2009-12-25 22:53:36

6

不需要meshgrid;簡單地使用:

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

+1,用於簡單而優雅的矩陣乘法解決方案。 – gnovice 2009-12-28 20:18:55

相關問題