Matlab如何通过列表迭代函数

时间:2017-10-08 17:10:21

标签: matlab list function loops iteration

我需要一些帮助迭代依赖于两个变量的函数。

所以,让我说我有一个依赖于两个变量的函数。 我们称之为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 个答案:

答案 0 :(得分:2)

假设函数无法进行矢量化,因此您确实需要进行迭代,一种简单的方法是通过ndgrid(创建 x y 描述所有可能对的值)和arrayfun(同时迭代两个 x y 值) :

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(:).';

在任何一种情况下,请注意,add的两个参数被强制为列向量(x(:))和行向量(y(:).'),因此单例扩展将自动创建所有对:

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

答案 1 :(得分: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