我需要一些帮助迭代依赖于两个变量的函数。
所以,让我说我有一个依赖于两个变量的函数。 我们称之为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]
我将如何做到这一点?
答案 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