从另一个数组的条件构建数组

时间:2013-10-16 16:54:36

标签: arrays matlab if-statement for-loop

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

  • 在三个选项A,B和C之间生成一个随机抽取的一千次复制数组,其中每次抽奖时,每个选项都有相同的概率被选中。

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

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

% 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. 什么是产生预期结果的更有效方法?

2 个答案:

答案 0 :(得分: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都需要为更大的向量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

答案 1 :(得分:0)

cnt=10;
option={'a','b','c'}
x=option([randi(numel(option),cnt,1)])