对于赋值,我需要创建一个函数文件,我输入3个值并输出2个向量。
为此,我创建了两个单独的函数文件s1
和s2
,它们具有向量和输出值作为输入(在此上下文中,它必须是球的数量)花瓶中的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
请注意,s1
和s2
包含用于确定N
的单独公式。
正如我所说,我要创建一个新的函数文件test
,其中我插入3个值n
,N
,M
(M
是随机球从花瓶中取出的次数),并且输出2个向量y
和z
分别包含s1
和s2
的所有值(因此在这两种情况下,它都需要是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
一百次,因此甚至根本不给我任何向量。
我做错了吗?或者我的功能文件甚至没有完全删除?
答案 0 :(得分:0)
您要将s1
和s2
的值分配给y
和z
,并覆盖之前y
和z
中的值在循环的每次迭代期间。在循环结束时y
和z
仅包含s1
和s2
计算的最后一个值。
您需要将返回的值分配给向量y
和z
中的不同索引,例如
y(k) = s1(randperm(N, n));
z(k) = s2(randperm(N, n));
这将s1
的值分配给y
的第k个元素(使其成为向量),将s2
的值赋给{{1}的第k个元素}}。现在,这将为长度为z
的{{1}}和y
创建一个向量,因为z
循环从M
循环到for
。
因此,您需要做的唯一更改是在1
和M
之后添加(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
之类的函数为y
和z
预分配空间通常更为有用。
y
这些为z
和y = zeros(M, 1);
z = zeros(M, 1);
长度y
创建向量,并用z
填充它们。它们应该在M
循环之前的函数中使用,如此
0