2017-10-08 53 views
0

我需要一些幫助來迭代依賴於兩個變量的函數。Matlab如何通過列表迭代函數

所以我們假設我有一個函數依賴於兩個變量。 我們稱之爲f = x + y

現在,我有兩個列表,一個x變量和一個y變量。例如, xlist = [1 2 3]和 ylist = [4 5 6]

我想通過列表中的每個元素並將其插入到f中。例如,設x = 1,然後評估f爲y = 4,然後y = 5,然後y = 6 ...並重復x = 2和x = 3。

最後,我想返回一個計算值的矩陣。對於上面的例子,答案應該是 [5 6 7]; [6 7 8]; [7 8 9]

我該如何去做這件事?

回答

2

假設功能不能矢量,因此你真的需要遍歷,一個簡單的方法是通過ndgrid(創建Xÿ值描述所有可能的對)和arrayfun(迭代同時在兩個Xÿ值):

f = @(x,y) x+y; % Or f = @fun, if fun is a function defined elsewhere 
xlist = [1 2 3]; 
ylist = [4 5 6]; 
[xx, yy] = ndgrid(xlist, ylist); % all pairs 
result = arrayfun(f, xx, yy); 

在許多情況下,功能可以是vectorized,這導致更快的代碼。對於例如功能,這將完成定義f作爲

f = @(x,y) bsxfun(@plus, x(:), y(:).'); 

或近Matlab的版本,你可以利用implicit singleton expansion和只寫

f = @(x,y) x(:)+y(:).'; 

在任何情況下,請注意,另外的兩個參數是被迫成爲列向量(x(:))和行向量(y(:).'),以便單例擴展將自動創建所有對:

xlist = [1 2 3]; 
ylist = [4 5 6]; 
result = f(xlist, ylist); 
+0

非常感謝!只是好奇,你能給我一個如何解決問題的例子,如果功能可以矢量化? – Programmer

+0

@Marcus這是答案的第二部分,不是嗎?或者你是什麼意思? –

1

另一種方法可以使用兩個for循環:

x_values=[2,4,6,8]; 
y_values=[1,3,5,7]; 
%initialize a matrix with zeros 
output_matrix=zeros(length(x_values),length(y_values)); 
for i=1:length(x_values) 
    for j=1:length(y_values) 
     output_matrix(i,j)=x_values(i)+y_values(j); 
    end 
end 

output_matrix