我有以下行向量:
A = zeros(1,200);
我想每2-3个列插入一个'1',直到我总共有80个大致均匀间隔的 - 而不是固定间距 - 前两列为零。
e.g。
0 0 1 0 1 0 0 1 0 0 1 0 1 ...
如果组合也可以被置换,那么多个行向量满足条件就会很好。
谢谢!
答案 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
矩阵,只需在0
和1
之间切换,这意味着我们希望扩展矩阵包含一些0
后跟1
1}},有些0
后跟1
等等。
values = ~mod(1:80, 2);
% 0 1 0 1 0 1 0 1 ....
在您的情况下,每个0
重复的次数将是1
或2
。但是,每个1
只会重复一次。为了实现这一目标,我们使用rand
在1
和2
重复之间随机选择。然后我们将1
值的所有重复分配为单个重复。
repeats = randi([1 2], size(values));
% Make sure that the 1's are always only repeated once
repeats(values) = 1;
我们在repeats
和values
数组中使用了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
我们在这里做的是:
在创建索引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(随机)