我是matlab的新手。我想做以下事情:
所以最终我需要像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的。所以我有三个问题:
答案 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)])