将矢量拆分成不同长度的矢量

时间:2014-07-16 15:12:06

标签: matlab vector

我想将具有90个数组的矢量分割为5个不同长度的矢量。每个载体的长度根据标准化长度确定,如下:

nl=[0.1642 .1516 .1259 .5583] 

因此每个载体的长度为

length=90*[0.1642 .1516 .1259 .5583]

但是这些长度不是整数,如果我试图将其舍入,则长度不等于90,由于一轮误差,它可能是89,90,91甚至92。 如果有人能协助我为此编写代码,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是一个众所周知的问题,只有不同的术语。想想选举nl是选票,你有90个席位要分发。

你会发现很多算法,我会使用D'Hondt方法。

Matlab中的实现可用于here,用于一些理论背景调查wikipedia

答案 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的评论..