考虑矢量值函数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
这有一个简单的解决方法吗?谢谢!
答案 0 :(得分:4)
您的foo
功能正常。但是,在循环内,foo
的输出仅分配给一个变量,即使您尝试将foo
中的两个值都放入矩阵中的一行中。这是MATLAB的技术性,起初可能看起来很烦人。它实际上将矩阵的整行视为单个变量,因此我们只从foo
获取第一个变量。第二个变量被丢弃。因为它只返回一个变量,所以在每次迭代循环中的赋值都会将整行分配为相同的数字,这是foo
的第一个输出。
有三种方法可以让它发挥作用:
foo
功能(àlaDivakar)如果要生成要分配给矩阵的输出向量,则需要返回一个变量并将exp(0)
和exp(1)
的两个值连接到输出。就这样:
function x = foo()
x = [exp(0) exp(1)];
end
然后,您可以相应地使用循环代码。
您可以保持foo
不受影响,但您需要先从foo
检索两个输出变量,然后将其分配给矩阵。就这样:
N=5;
Results = zeros(N,2);
for i=1:N
[x, y] = foo();
Results(i,:) = [x, y];
end
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,:)
。