如何在这个函数文件中放置一个for循环,并有2个向量作为输出?

时间:2015-10-24 20:29:58

标签: matlab

对于赋值,我需要创建一个函数文件,我输入3个值并输出2个向量。

为此,我创建了两个单独的函数文件s1s2,它们具有向量和输出值作为输入(在此上下文中,它必须是球的数量)花瓶中的N,唯一的信息是从花瓶中取出的n球的数量):

function s1=s1(x)
n=length(x);
s1=2*(sum(x)/n)-1;
end      
function s2=s2(x)
n=length(x);
s2=((n+1)/n)*max(x)-1
end       

请注意,s1s2包含用于确定N的单独公式。

正如我所说,我要创建一个新的函数文件test,其中我插入3个值nNMM是随机球从花瓶中取出的次数),并且输出2个向量yz分别包含s1s2的所有值(因此在这两种情况下,它都需要是Mx1向量)。

这就是我现在test所拥有的:

function [y,z] = test(N,n,M)
for k=1:M
y=s1(randperm(N,n));
z=s2(randperm(N,n));
end

此处命令randperm(N,n)每次从N个球的总数中选择一个随机数量的n球,所以例如randperm(10,3)会给我3个随机数来自该集合( 1,2 ... 10)。

然而,所有这个函数似乎都是计算值s2一百次,因此甚至根本不给我任何向量。

我做错了吗?或者我的功能文件甚至没有完全删除?

1 个答案:

答案 0 :(得分:0)

您要将s1s2的值分配给yz,并覆盖之前yz中的值在循环的每次迭代期间。在循环结束时yz仅包含s1s2计算的最后一个值。

您需要将返回的值分配给向量yz中的不同索引,例如

y(k) = s1(randperm(N, n));
z(k) = s2(randperm(N, n));

这将s1的值分配给y的第k个元素(使其成为向量),将s2的值赋给{{1}的第k个元素}}。现在,这将为长度为z的{​​{1}}和y创建一个向量,因为z循环从M循环到for

因此,您需要做的唯一更改是在1M之后添加(k),这将提供

y

您可以从阅读Matrix Indexing in Matlab中受益。这篇文章很好地解释了z如何工作的基础知识。在Matrix Indexing上也有更高级的文档。

除此之外:还要注意。如果您使用上面的代码,Matlab将在循环的每次迭代期间重新分配function [y, z] = test(N, n, M) for k = 1:M y(k) = s1(randperm(N, n)); z(k) = s2(randperm(N, n)); end end (k)的内存,因为它们变大。使用zeros之类的函数为yz预分配空间通常更为有用。

y

这些为zy = zeros(M, 1); z = zeros(M, 1); 长度y创建向量,并用z填充它们。它们应该在M循环之前的函数中使用,如此

0