在伪固定间隔处插入一个

时间:2016-06-14 19:16:05

标签: matlab

我有以下行向量:

A = zeros(1,200);

我想每2-3个列插入一个'1',直到我总共有80个大致均匀间隔的 - 而不是固定间距 - 前两列为零。

e.g。

0 0 1 0 1 0 0 1 0 0 1 0 1 ...

如果组合也可以被置换,那么多个行向量满足条件就会很好。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用repelem(行程编码)来执行此操作。 repelem的工作方式是我们有两个输入:值和每个值重复的次数。

例如

values = [0 1];
repeats = [1 2];

repelem(values, repeats)
%   0   1   1

我们也可以在values数组

中包含重复值
values = [0 1 0 1];
repeats = [2 1 1 1];

repelem(values, repeats)
%   0   0   1   0   1

我们可以利用它来解决您的问题。

首先,我们构建values矩阵,只需在01之间切换,这意味着我们希望扩展矩阵包含一些0后跟1 1}},有些0后跟1等等。

values = ~mod(1:80, 2);
%   0   1   0   1   0   1   0   1   ....

在您的情况下,每个0重复的次数将是12。但是,每个1只会重复一次。为了实现这一目标,我们使用rand12重复之间随机选择。然后我们将1值的所有重复分配为单个重复。

repeats = randi([1 2], size(values));

% Make sure that the 1's are always only repeated once
repeats(values) = 1;

我们在repeatsvalues数组中使用了80个条目,以确保我们在最终(扩展)数组中最终得到至少 80个值。< / p>

现在应用repelem并仅保留前80个值

result = repelem(values, repeats);
result = result(1:80);
%   0     1     0     0     1     0     0     1     0     1     0     0     1

答案 1 :(得分:0)

您可以使用一些标准函数和数组索引来完成此操作。像这样......

A = zeros(1,200);
ixs = round(cumsum(2 + rand(200,1)));
A(ixs(ixs<200))=1;
%Sample result here, first 20 entries: 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 

我们在这里做的是:

  1. 设置A阵列(这很清楚)
  2. 将超大的索引值数组定义为1(以下更多内容)
  3. 然后使用该索引将值设置为1,修剪超大尺寸。
  4. 在创建索引ixs方面,在最里面的部分(2 + rand(200,1))创建一个介于2和3之间的200x1值。使用cumsum生成此数组的累积和,然后round将值舍入为整数,该整数可用于索引。例如,对于特定的运行,前10个值ixs如下所示:

    >> ixs(1:10)'
    ans =
         3  5   8  11  13  16  18  20  22  24
    

    由于1值的数量每次都会有所不同,因此我将其设置为超大尺寸。也就是说,最后几个值是[487 489 491 497 500],大于所需的实际大小。这就是为什么需要通过应用索引来修剪值。

答案 2 :(得分:0)

A = zeros(1,200);
idx = cumsum(1 + randi(2,80,1)); % This is the main trick
A(idx) = 1;

cumsum(1 + randi(2,80,1))获取A中80个元素的索引,需要切换为1,间隔2或3(随机)