arrays - 根据另一个数组上的条件构建数组

标签 arrays matlab if-statement for-loop

我是 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中承担的。所以我有三个问题:

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

最佳答案

使用 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/

相关文章:

java - 在 java 中,使用 "new"初始化数组有什么好处?

matlab - 使用 xcorr 查找两个正弦 10Hz 之间的时间延迟时如何解决错误

java - 将java语法折叠成单行

linux - 循环遍历一个目录并检查它是否存在于另一个目录中

algorithm - 计算给出数组中最小标准偏差的子集

c++ - 我的 C++ 代码永远不会通过 else 语句执行

php - 在 PHP 中使用另一个数组构建多维数组

arrays - 从 .NET 数组中删除元素 .remove 方法未按预期工作(Powershell)

java - 制作数组列表的副本而不循环

c - 用于 C 运行时动态链接的 Matlab Engine API