2

我是matlab的新手。我想做以下事情:

  • 在三个备选方案 A、B 和 C 之间生成一个包含一千次随机抽签的数组,其中在每次抽签时,每个备选方案都有相同的被选中概率。

所以最终我需要像 P = [ AABCBBBCACACC ... ] 这样的东西,其中数组中的每个元素都是在三个可能的结果中随机选择的。

我想出了一个解决方案,它给了我我想要的东西,即

% Generating random pick among doors 1,2,3, where 1 stands for A, 2 for B,
% 3 for B.

I = rand(1);

if I < 1/3
    PP = 1;
elseif 1/3 <= I & I < 2/3
    PP = 2;
else 
    PP = 3;
end 

% Generating a thousand random picks among dors A,B,C

I = rand(999);

for i=1:999    
if I(i) < 1/3
    P = 1;
elseif 1/3 <= I(i) & I(i) < 2/3
    P = 2;
else 
    P = 3;
end 
PP = [PP  P]
end

正如我所说,它可以工作,但是当我运行该程序时,在我看来这是一项简单的任务需要一段时间。同时,我长这样的任务是“应该”在matlab中承担的。所以我有三个问题:

  1. 这真的是产生预期结果的缓慢过程吗?
  2. 如果是,为什么这个过程特别慢?
  3. 产生预期结果的更有效方法是什么?
4

2 回答 2

4

这可以更容易完成randi

>> PP = randi(3,1,10)
PP =
     2     1     3     3     2     2     2     3     2     1

如果您真的想在 3 个选项之间进行选择,您可以randi直接使用 的输出来索引另一个矩阵。

>> options = [13,22,77]
options =
    13    22    77
>> options(randi(3,1,10))
ans =
    22    13    77    13    77    13    22    22    77    13

至于您的解决方案缓慢的原因,您可以执行类似的操作:

x = [];
for i=1:10
    x = [x i^2]; %size of x grows on every iteration
end

这不是很好,因为在每次迭代中,Matlab 都需要为更大的 vector 分配空间x。在旧版本的 Matlab 中,这会导致二次行为(如果将问题的大小加倍,则需要 4 倍的时间)。在较新的版本中,Matlab 足够聪明,可以避免这个问题。但是,如果您事先知道它有多大,那么为您的数组预分配空间仍然被认为是好的:

x = zeros(1,10); % space for x is preallocated. can also use nan() or ones()
for i = 1:length(x)
    x(i) = i^2;
end

但在许多情况下,使用不使用任何 for 循环的矢量化代码会更快,如下所示:

x = (1:10).^2;

所有 3 种解决方案都给出相同的结果:

x =    1     4     9    16    25    36    49    64    81   100
于 2013-10-16T17:08:47.017 回答
0
cnt=10;
option={'a','b','c'}
x=option([randi(numel(option),cnt,1)])
于 2013-10-16T17:09:37.337 回答