我有以下行向量:
A = zeros(1,200);我想每2-3列插入一个'1‘,直到我总共有80个1,它们的间距大致相等-而不是固定间距-前2列是零。
例如:
0 0 1 0 1 0 0 1 0 0 1 0 1 ...如果组合也可以被置换,以便多个行向量满足条件,那就太好了。
谢谢!
发布于 2016-06-15 03:44:22
您可以使用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,一些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个值。
现在应用repelem并只保留前80个值
result = repelem(values, repeats);
result = result(1:80);
% 0 1 0 0 1 0 0 1 0 1 0 0 1发布于 2016-06-15 03:55:57
您可以使用一些标准函数和数组索引来实现这一点。就像这样..。
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],大于实际所需的大小。这就是在应用索引时需要修剪这些值的原因。
发布于 2016-06-15 04:48:27
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(随机)
https://stackoverflow.com/questions/37820364
复制相似问题