在循环中分配向量值MATLAB函数的结果

时间:2014-11-13 03:41:16

标签: matlab

考虑矢量值函数foo()

function [x, y] = foo()
x = exp(0);
y = exp(1);
end

以及一个总共foo()次调用N的脚本,

N=5;
Results = zeros(N,2);

for i=1:N
    Results(i,:) = foo();
end

Results的所需内容:

1    2.7183
1    2.7183
1    2.7183
1    2.7183
1    2.7183

Results的实际内容:

1    1
1    1
1    1
1    1
1    1

这有一个简单的解决方法吗?谢谢!

2 个答案:

答案 0 :(得分:4)

您的foo功能正常。但是,在循环内,foo的输出仅分配给一个变量,即使您尝试将foo中的两个值都放入矩阵中的一行中。这是MATLAB的技术性,起初可能看起来很烦人。它实际上将矩阵的整行视为单个变量,因此我们只从foo获取第一个变量。第二个变量被丢弃。因为它只返回一个变量,所以在每次迭代循环中的赋值都会将整行分配为相同的数字,这是foo的第一个输出。

有三种方法可以让它发挥作用:

1。修改您的foo功能(àlaDivakar)

如果要生成要分配给矩阵的输出向量,则需要返回一个变量并将exp(0)exp(1)的两个值连接到输出。就这样:

function x = foo()
x = [exp(0) exp(1)];
end

然后,您可以相应地使用循环代码。

2。在循环中使用临时变量

您可以保持foo不受影响,但您需要先从foo检索两个输出变量,然后将其分配给矩阵。就这样:

N=5;
Results = zeros(N,2);

for i=1:N
    [x, y] = foo();
    Results(i,:) = [x, y];
end

3。修改您写入Results(大卫)

的方式

您可以通过修改调用foo的方式来取消临时变量。您必须自己编入索引Results才能访问调用中foo输出中的每个值。因此:

N=5;
Results = zeros(N,2);

for i=1:N
    [Results(i,1), Results(i,2)] = foo();
end

我不喜欢这种方法,因为它看起来很乱,但如果你不想使用临时变量,这是一种方法。

答案 1 :(得分:0)

定义function [x,y] = foo()时,该函数应调用[x,y]=foo(),或者[Results(i,1), Results(i,2)]=foo()

如果您执行Results(i,:)=foo(),它将仅返回foo()的第一个参数,即1.0,并广播到Results(i,:)