2017-10-08 72 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