我是 matlab 新手。我想做以下事情:
- 在三个备选方案 A、B 和 C 之间随机抽签,生成一个包含一千次重复的数组,其中每次抽签时,每个备选方案都有相同的被选中概率。
所以最终我需要类似 P = [ A A B C B B B C A C A 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中承担的。所以我有三个问题:
- 这真的是一个产生预期结果的缓慢过程吗?
- 如果是,为什么这个过程特别慢?
- 什么是更有效的方法来实现预期结果?
最佳答案
使用 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
关于arrays - 根据另一个数组上的条件构建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19409251/