首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以伪固定间隔插入1

以伪固定间隔插入1
EN

Stack Overflow用户
提问于 2016-06-15 03:16:05
回答 3查看 31关注 0票数 0

我有以下行向量:

代码语言:javascript
复制
A = zeros(1,200);

我想每2-3列插入一个'1‘,直到我总共有80个1,它们的间距大致相等-而不是固定间距-前2列是零。

例如:

代码语言:javascript
复制
0 0 1 0 1 0 0 1 0 0 1 0 1 ...

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

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2016-06-15 03:44:22

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

例如

代码语言:javascript
复制
values = [0 1];
repeats = [1 2];

repelem(values, repeats)
%   0   1   1

我们也可以在values数组中有重复的值

代码语言:javascript
复制
values = [0 1 0 1];
repeats = [2 1 1 1];

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

我们可以利用这个来解决你的问题。

首先,我们构造values矩阵以简单地在01之间交替,这意味着我们希望扩展后的矩阵包含一些0后跟1,一些0后跟1,依此类推。

代码语言:javascript
复制
values = ~mod(1:80, 2);
%   0   1   0   1   0   1   0   1   ....

在您的例子中,每个0的重复次数将是12。然而,每个1只会重复一次。为了实现这一点,我们使用rand12重复之间随机选择。然后,我们将1值的所有重复指定为单个重复。

代码语言:javascript
复制
repeats = randi([1 2], size(values));

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

我们在repeatsvalues数组中使用80个条目,以确保最终(展开的)数组中至少有80个值。

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

代码语言:javascript
复制
result = repelem(values, repeats);
result = result(1:80);
%   0     1     0     0     1     0     0     1     0     1     0     0     1
票数 0
EN

Stack Overflow用户

发布于 2016-06-15 03:55:57

您可以使用一些标准函数和数组索引来实现这一点。就像这样..。

代码语言:javascript
复制
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数组(这是一个超大的索引值数组,要设置为1(下面将详细介绍)
  2. ,然后使用该索引将值设置为1,从而修剪超大的。

就创建索引ixs而言,在最里面的部分(2 + rand(200,1))创建一个由2到3之间的值组成的200x1数组。使用cumsum生成此数组的累积和,然后round将这些值四舍五入为可用于索引的整数。例如,对于特定的运行,前10个值是ixs

代码语言:javascript
复制
>> ixs(1:10)'
ans =
     3  5   8  11  13  16  18  20  22  24

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-15 04:48:27

代码语言:javascript
复制
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(随机)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37820364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档