我想将具有90个数组的矢量分割为5个不同长度的矢量。每个载体的长度根据标准化长度确定,如下:
nl=[0.1642 .1516 .1259 .5583]
因此每个载体的长度为
length=90*[0.1642 .1516 .1259 .5583]
但是这些长度不是整数,如果我试图将其舍入,则长度不等于90,由于一轮误差,它可能是89,90,91甚至92。 如果有人能协助我为此编写代码,我将不胜感激。
答案 0 :(得分:2)
这是一个众所周知的问题,只有不同的术语。想想选举nl
是选票,你有90个席位要分发。
你会发现很多算法,我会使用D'Hondt方法。
答案 1 :(得分:0)
我天真的实施:
% some normalized lengths
len = rand(1,4);
len = len ./ sum(len);
% convert to integers (round towards zeros)
d = fix(len.*90);
% fix the count by adding remaning elements to the last bin
d(end) = d(end) + (90-sum(d));
% sanity check
assert(sum(d)==90)
以下是使用HISTC
的更好解决方案:
edges = cumsum(len.*90);
[counts,idx] = histc(1:90, [0 edges(1:end-1) Inf]);
counts(end) = [];
现在counts
包含每个bin中的元素数量,idx
包含90个元素中每个元素的bin索引。
警告:上述两种方法可能会在极端情况下提供不太理想的拆分。有关示例,请参阅@ Daniel的评论..