图像缩略图

集运

版本1.0.0.0(10.6 KB)由 约翰D'ERRICO
以x来合并共同的元件(可以是n维),聚集对应的y。

11个下载

更新2007年9月10日

查看许可证

合并器有很多用途。它被设计用来解决插值问题,德劳内的问题,但我也增加了其他用途。它可以作为一种工具,可计算每个点的重复次数,或简单地独特的(X,“行”)的实施,但对那种独特的烦躁的公差。

当有重复的x值插值失败。通常建议,以形成平均Y的用于复制的x值,消除了代表。合并器做到这一点,并允许用户对如何x的近两个值需要是被视为重复的公差。X可具有多列,即它适用于多维数据。X甚至可以是字符数组。

同样的问题是无论是在interp1和的GridData看到。德劳内和delaunayn也没有强大的使用时有重复或接近重复数据调用。

示例用法:

%重复计数
X = ROUND(兰特(100000,1)* 2);
[XC,YC] =合并器(X,[], '计数');
[XC,YC]
ANS =
0 25160
1 49844
2 24996

%的聚集y表示x中的独特元素
%Y = X(:,1)+ X(:,2)+误差
X = ROUND(兰特(100000,2)* 2);
Y =总和(X,2)+ randn(大小(X,1),1);
[XC,YC] =合并器(X,Y, '平均');
[XC,YC]
ANS =
0 0 0.0054
0 1.0000 0.9905
0 2.0000 1.9895
1.0000 0 0.9957
1.0000 1.0000 1.9970
1.0000 2.0000 2.9988
2.0000 0 2.0136
2.0000 1.0000 2.9985
2.0000 2.0000 3.9891

使用函数处理预备的用法:
[XC,YC] =合并器(X,Y,@平均值);

聚集也可以是多种类型的。最小值,最大值,平均值,总和,标准,VAR,中位数,督促,以及几何和谐波手段,再加上简单的计数选项。功能手柄的使用允许
任何聚集用户可能希望。

集运是accumarray很大的不同。
需要注意的是accumarray建立一个潜在的巨大
阵列,用零填充。此数组不能在高于2个维度的稀疏。此外,accumarray不允许的公差。它的第一个参数必须是一个指标。最后,合并器工作在串了。

引用作为

约翰D'ERRICO(2020年)。集运(//www.tatmou.com/matlabcentral/fileexchange/8354-consolidator),MATLAB中央文件交换。检索

评论和评分(45

aldburg

jasongrig

嗨,

我可以用它来推导百分?说,第95百分位?

谢谢,
Iason的

完善。感谢您对这项工作

马蒂亚斯

嗨,约翰,
伟大的提交!

我有一个小的调整,将允许个人容差,即使这是一个有点难看:

%巩固x的元素。
%第一移位,规模,然后细胞。
如果numel(TOL)<尺寸(X,2)
TOL = repmat(TOL,1,尺寸(X,2));
结束
BGZ = TOL> 0;
xhat = X;
如果任何(BGZ)
xhat(:,BGZ)= X(:,BGZ) - repmat(分钟(X(:,BGZ),[],1)+ TOL(BGZ)* EPS中,n,1);
xhat(:,BGZ)=小区(bsxfun(@ rdivide,xhat(:,BGZ),TOL(BGZ)));
结束

希望它可以帮助别人。

礼萨Farrahi蒙哈达

该功能正是我一直在寻找。感谢您提供它,约翰!
我刚刚发现了一个小错误:
碰巧我施加巩固到x = 0.2和y = [11 6.8]。
[XC,YC] =合并器(X,Y, '@nanmean')
XC = 0.2
YC = 11

Y的最后一个值是走了;所述集莫名其妙地“吞噬”了。
虽然它没有任何意义巩固只有一个行的一个数组,这个功能在这样的应用程序都可能发生,自动处理大量不同的阵列时尤其如此。

瓦格纳

它只是工作!非常感谢。

对不起约翰,

我重新启动后一切开始工作的伟大。不知道问题是什么,但似乎并没有进行相关的整合器的功能。

感谢您的关注

约翰D'ERRICO

威尔 - 很抱歉,但你需要对你的问题更加清晰。我不能在这个问题猜测。最简单的就是给我说有问题的数据,如注释咨询是不是我的选择。

我需要一些帮助,这功能。似乎只是我工作的一列数据是工作。使用“平均”和@nanmean两者结果只装着的NaN列尝试。有数值数据存在,我可以看到它在y可变的,并且它出现在ycon到显示为0,直到线258其中:

ycon(计数== 1,:) = Y(EC == 1,:)

ycon变成什么,但NaN的

它的工作原理,但它改变rows.How的顺序,我可以合并重复,但仍保持相同的顺序?

谢谢

Suti

Yavor KAMER

亲爱的约翰,

关于我以前的评论,我发现,对于具体的测试功能进行相对更好,如果我变线204
IU = [真;任何(差异(xhat),2)];

IU = [真;任何(ABS(差异(xhat))> 1,2)];

我也有一种预感,上线199上的sortRows(基于1维列)可以改进要考虑到所有可能的列的顺序排列。我想这样做,但到了一定的并发症,并放弃了。

Yavor KAMER

亲爱的约翰,
您的集运的功能被证明是我的Delaunay三角确实是必不可少的。然而,当我试图用一组点来测试它扰动的不确定性半径我无法检索初始中心内围绕5个中心。

UNC = 0.2;
mat_i = [1 0 0;1 2 0;0 3 0;1 1 0;2 1 2];
mat_all = mat_i;
对于i = 1:100的
mat_all = [mat_all;mat_i +(兰特(大小(mat_i)) - 0.5)* UNC;];
结束
mat_c =合并器(mat_all,[],[],UNC);

对于一个实现mat_c结束了最后两行是:
1.917 0.900 2.067
2.006 1.001 2.000
这与公差(0.2)不一致。这是预期的结果,或者是有什么错我的测试?

谢谢

要命的功能。帮助“按组”的问题,解决我的SQL-等。在旁边没有时间巩固我的2万条记录。谢谢!

ade77

美丽的功能。更漂亮,当你与cellfun在一起选择使用它。正是我一直在寻找。

Mathworks公司,请谦虚和包括MATLAB此功能,并支付适当费用的创造者。

谢谢约翰

惊人的,但约翰D'ERRICO另一个伟大的代码,它似乎是一半的代码,我使用最终会被他写的。

非常感谢你!我一直在到处找一种方式来确定唯一的行和理货重复的次数,这是迄今为止最简单的解决方案 - 它的工作对我的第一次尝试和产出是很容易的情节。做得好!

格里

我只是没有实现“整合者”可以使用其他的功能的聚合模式,在我的情况nanmedian等等。我曾用“consolidator13”,不能用它避开了NaN的数据。貌似简单的“整合者”,它只有一个处理这些其他功能,我相信它会做的伎俩我。谢谢。

约翰D'ERRICO

好了,在一定程度上,像nanmean工具可以提供帮助。例如...

X =小区(5 *兰特(10,1));
Y =兰特(10,1);
Y(2)=南;

[XC,YC] =合并器(X,Y,@ nanmean)
XC =
1
2
3
4

YC =
0.66434
0.36668
0.42507
0.16971
0.54419

如果x在它的NaN虽然,事情就变得粘稠。集运不会有生存的NaN。虽然我可以修复这个工作1-d的数据,但它仍然会失败更高的层面。

格里

请帮忙 ...
我一直在使用,没有任何问题整合商,爱它。但是,我碰到一个NaN值数据集,并没有奏效。我收到了一堆的NaN,甚至与真实的数据行。有没有办法解决?谢谢。

更挖显示,克里斯托弗发现行为是四舍五入,和浮点运算通常的的功能。但它不是东西,我可以做整合者健壮,因为在至少显著位电平变化总会引起这样的代码问题。

由Christophe力量做了一个宽容的这种选择MATLAB /集运执行浮点数之间的比较。随着公差设置为完全提供的一组连续项之间的差异,在某些情况下,一定是失败的。请阅读本文件:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

使用浮点运算在MATLAB中导致这种失败。在这里,使用一个版本的整合者与一个微妙的不同的内部测试,我得到的结果是克里斯托夫做的:

合并器([1,2,3,3.01,6]”,[],[],1)
ANS =
1.5
3
3.01
6

然而,现在仅通过极少量改变公差,我们可以得到另一种不同组四舍五入的结果。

合并器([1,2,3,3.01,6]”,[],[],1-10 * EPS)
ANS =
1
2.5
3.01
6

合并器([1,2,3,3.01,6]”,[],[] ,. 9999999999999)
ANS =
1
2
3.005
6

同样,这些差异,因为浮点运算和使用,宽容之心如此接近的一组成员之间的步幅的出现。这不是东西,我可以改变,修复,修复,或代码以更好的方式,因为如果我没有做出改变和其它一些组数据会导致同样的问题。

我会说,这就是我所说的传递问题。当您指定的1公差,如何整合者解决集合[1 2 3]?是1和2混为一谈?或2和3?显然,每个那些对是相同的为1的公差范围内然而,我们不能他们都放到一个单一组,因为1和3未在规定的公差范围内。还是应该?我们可以很逻辑论证聚集下来,这些套:

[1,2,3]
[1.5,3]
[1,2.5]
[1.5,2.5]
[2]

问题的关键是,要注意的是比较浮点数测试。和提防迫使代码,使这些测试。你可以(而且会)这样做几乎看随机的结果。

最后,应避免使用,宽容之心如此接近的一组元素之间的步幅加以解决。集运的目的不是要成为一个集群的工具,而是成为一种工具,将重复值结合在一起,并以少量数据中的噪声的生存。公差允许因而被组合中的数字的微小变化。如果您尝试使用集运到集群数字加在一起,就可能成功,但你可以绊倒它。无论什么,及物性问题是重要的,是不能够解决的明确的方式,对于所有的数据集。

约翰

约翰D'ERRICO

克里斯托弗:我的猜测是你的测试中使用的变量,其中一些数字是不准确的整数,所以有一些涉及浮点垃圾。这导致的结果是,从你所期望的,集运的不是编程略有不同。

我要求,因为当我尝试所示的具体例子,直接粘贴到MATLAB,我得到预期的结果是真实的。(我不知道是什么MATLAB释放你的测试中完成的,因为有时是版本的问题了。不同的CPU,也有时会导致细微的差别,但我认为,无论是释放或CPU这里有问题。)

合并器([1,2,3,3.01,6]”,[],[],1)
ANS =
1
2
3.005
6

在一般情况下,合并器使用一个简单的方案做了汇总。这是必要的速度,因此,将在更高层次上提高工作效率。需要注意的是,总是会有什么,我会打电话的“及物”的问题。因此,假设要对所述一组[1 1.5 2]进行合并,以0.75的耐受性。

清楚地1至1.5是所期望的容限内,所以它们应该被分组在一起。但这样是1.5和2,所以他们也应该进行分组。然而,1和2不能组合在一起。

问题的关键是,有没有计划,这将解决任何可能的数据集,聚集点到明确简化的集合,所有的都会同意是正确的。

感谢这个伟大的贡献。
但是,除非我误解的功能,我希望

合并器([1,2,3,3.01,6]”,[],[],1)

回来

1
2
3.005
6

然而,它返回

1.5000
3.0000
3.0100
6.0000

这是预期的行为?那岂不是意义聚集的1和2 3和3.01呢?

这并不完全是ACCUMARRAYN(我同意有肯定需要来定),因为聚合函数必须(我相信)每输入矩阵的列返回一个值。然而,ACCUMARRAY具有能够返回一个单元阵列的精彩属性:
C = accumarray(A,B,[] @(X){X});
我有事业才能使用此功能的许多倍。任何机会,你可以把它添加到集运,约翰?

和休息。

幸运的洛伦对accumarray链接到这里(如“衍生作品”)博客!这是伟大的作家花时间来发布预accumarray的版本了。谢谢!

w ^小号

大和快速的工具,我经常使用。我唯一想念的是,不同的公差适用于不同的x列。那太好了。

陈力

下面是我用它来巩固两个列表,并在YList同时删除异常值。然而,它在呼唤整合者的三倍。
任何人有更好的主意吗?
**********************************
[XG,米尼,印第安纳州] =合并器(的Xlist,ylist, '平均');
[XG,STDY,印第安纳州] =合并器(的Xlist,ylist, '的std');

notoutlier =找到(ABS(ylist-米尼(茚基))<3 * STDY(IND))
的Xlist =的Xlist(notoutlier);
ylist = ylist(notoutlier);
[XG,YG,印第安纳州] =合并器(的Xlist,ylist);

罗纳德·克林顿

大和快速的工具,我一直在使用了一段时间。至于“2007-09-08提供计数信息作为第四输出”,改变的版本似乎并没有被上传(2007年10月18日)

谢尔盖Koulayev

这将是很好,如果该程序将报告有多少个元素落入每个簇...

莱门佑

我发现这极大地方便使用。优良的快速修复程序。感谢您使其可用。

加布里埃尔asaftei

约翰D'ERRICO

A.L. - 我上传整合者的新版本,也固定在改变历史,指出其他几个小问题。当MATLAB中心承认在几个小时的新版本,请检查consolidator13现在正常运行,因为我无法测试它低于R14。感谢您识别问题。我对不便深表歉意。

A. L.

对于以前的评论(仅限测试)可能的修复:

更换线201:

计数= accumarray(EB,1)'。

有:

计数= DIFF(找到([IU;真]))'。

A. L.

在R13版本用途accumarray,我不认为是可用的,直到R14(我可能是错的),如果你想使用集运到accumarray功能添加到旧版本这是相当令人失望。

IRAM韦恩斯坦

这是一个非常有用的功能。然而,当聚集的选项是“计数”,我发现杜安Hanselmann的mmrepeat快得多

罗伯特·沃特

这是怎么不同的,那么accumarray?

梁晋

这正是我期待的!
在MATLAB的HIST()的功能非常有限。

迈克尔Ebstyne

急需除了MATLAB的功能!对于那些从SQL世界的到来,用来做大规模聚集和简单的SQL语句的数据集的复杂似地滚,你可能一直在寻找这一点。一个suggustion ......这将是杀手多个列应对多种聚合类型。

埃文·韦勒

我同意乌尔斯。将AB优秀纳入到Matlab的未来版本。

正是我需要对我的工作。

URS(我们)施瓦茨

哇,多么的期待已久的代码(几乎)完美地编码片段!这太糟糕了,但是,有两个问题微不足道它:

- 帮助部分是TOO罗嗦(几乎一个新颖本身),并必须精简到非常必要的,裸骨

- 名称合并器被分散注意力(和大多数人而混淆)和(真的!)应改为ACCUMARRAYN,这是它确实:扩展这个否则伟大的除了ML系列的预包装功能的功能(只是考虑如何轻松地预处理的数据进行了统计TBX的家庭方差分析的!)

总之,这个代码是必不可少的一个甚至可能会问,在TMW的亲爱的人,包括它(甚至在mexed形式)在未来的版本中的一个
我们

更新

1.0.0.0

提供计数信息作为第四输出

1.评论关于复杂X转化为其实部和虚部。
2.公差BUG修复时代表是在最小元件公差水平内。
3.添加的姓名,电子邮件等的代码。

1.Replaced使用accumarray为consolidator13。
2.Replaced与小区一轮改善端点附近整合者的聚集行为。3.允许用户供给行向量。4.修正了故障,当x是一个标量的错误。

文档变化

现在它的(矩形)的字符数组。

较新的代码已经加快,加上几个
小错误是固定的。

非常感谢乌尔斯施瓦茨是由于他在援助
调试我的代码草案和建议
在代码的替代方案以及接口。

MATLAB版本兼容性
创建了R14SP1
与任何版本兼容
平台兼容性
视窗 苹果系统 Linux的