对月份数组MATLAB进行排序

时间:2014-07-07 18:16:21

标签: arrays matlab sorting

我目前正在处理一个相当困难的排序问题。

我有一个数月表示。让我们假设数组看起来像这样:

mth = [3;4;5;6;7;8;9;10;11;12;1;2;3;4;5;6]

我想对上面提到的那样进行排序:

mth = [1;2;3;4;5;6;7;8;9;10;11;12]

其余部分应出现在另一个数组中:

mthDiscard =[3;4;5;6]

现在假设我们超过2年,那么我希望排序看起来像这样:

mth = [3;4;5;6;7;8;9;10;11;12;1;2;3;4;5;6;7;8;9;10;11;12;1;2;3;4;5;6]

这样:

mth = [1;2;3;4;5;6;7;8;9;10;11;12;1;2;3;4;5;6;7;8;9;10;11;12]
mthDiscard = [3;4;5;6]

我怎样才能实现这种排序?

更多信息:

我需要提到的是,我每个月都有一个带消费值的向量。我希望实现这一点,以便我每个月定期消费价值!因此,如果我有13个月的数据,我会丢弃一个月。

2 个答案:

答案 0 :(得分:0)

一种简单的方法是查看每月存在的次数。只有一两个这样的值,比如mm+1。显示超过m次的月份(如果有)将被丢弃。最终结果是1:12重复m次。

n = histc(mth,1:12); %// number of times each month is present
m = min(n);
mthDiscard = find(n>m); %// these are discarded as they don't fill a whole year
mth = repmat(1:12,1,m).'; %'// final result

答案 1 :(得分:0)

如果我正确地理解了您“丢弃”月份的标准,我认为您只是采用12 * k月份的最长序列,如:

idx = fix(numel(mth)/12)*12;
mth_kept = mth(1:idx)
mth_discarded = mth(idx+1:end)

然后,如果您希望序列始终从1开始,我们可以执行循环移位:

circshift(mth_kept, mth(1)-1)

(假设月份总是按顺序排序,并且两者之间没有错过的月份。)

相关问题