联盟和Interseciton的间隔

39视图(30天)
尤里斯Lambrecht
尤里斯Lambrecht 2011年6月9日
评论道: 丹Bindman2020年10月2日
我希望能够很快确定时间间隔造成工会和不同间隔的十字路口。间隔的数量可能会有所不同,所以需要一些灵活的方法。
在常规Matlab我只找到了一种相交集(例如:{1,2,3}u{2,4})不是间隔(如(0.1 - 3.3)n (1.1 - 2.9)
在“u”表示联盟和“n”表示的十字路口。
例如:([1.1,2.3]u [2.8 - 3.2]) n ([1.9, 3.1] u [4.2 - 4.3]) n [1.7, 3.2] = [1.9, 2.3] u [2.8, 3.1]
在MuPad,你可以做以下几点:(Dom:间隔([1.1,2.3])联盟Dom::区间(2.8,3.2))相交(Dom:间隔([1.9,3.1])联盟Dom::区间(4.2,4.3))相交(Dom:区间([1.7,3.2]))
没有MuPad任何想法如何做到这一点?我看过区间合并的文件交换入口但它只处理工会的间隔。
谢谢!
3评论
丹Bindman
丹Bindman 2020年10月2日
谢谢亚历克斯!我搞砸了。在for循环中,我使用我在某些情况下应该使用unionCount…anyhoo新代码:
函数unionOfIntervalsMat = unionOfIntervals (intervalsMat)
% unionOfIntervalsMat = unionOfIntervals (intervalsMat)需要一组
%(关闭)的间隔,并返回这些间隔的工会。
%的每一行输入变量intervalsMat是一个区间,第一列
%的下界的间隔和第二列上界。
%的每一行输出变量unionOfIntervalsMat也是一个间隔,类似的定义。
intervalsMat = sortrows (intervalsMat, 1);
nIntervals =大小(intervalsMat, 1);
unionOfIntervalsMat = 0(大小(intervalsMat));
unionOfIntervalsMat (1) = intervalsMat (1:);
unionCount = 1;
我= 2:nIntervals
如果intervalsMat(我,1)< = unionOfIntervalsMat (unionCount, 2)
unionOfIntervalsMat (unionCount 2) = max ([intervalsMat(我,2)unionOfIntervalsMat (unionCount, 2)]);
其他的
unionCount = unionCount + 1;
unionOfIntervalsMat (unionCount:) = intervalsMat(我:);
结束
结束
unionOfIntervalsMat = unionOfIntervalsMat (1: unionCount,:);
结束
我认为现在应该在任何情况下工作。这是为你的例子:
> > unionOfIntervalsMat = unionOfIntervals ([1 10;2 3;5 6])
unionOfIntervalsMat =
1 10
这是原始的例子(依然正确的输出):
intervalsMat =
4 10
28日31日
11日12
1 7
13日17
16日23
8 11
25岁29岁
> > unionOfIntervalsMat = unionOfIntervals (intervalsMat)
unionOfIntervalsMat =
1)12
13日23
25日31日

登录置评。

答案(2)

肖恩·德Wolski
肖恩·德Wolski 2011年6月9日
医生相交
医生联盟
和朋友。然而,谨防浮动点。
fpno = @ (x) uint32 (x * 1000);%摆脱浮动点
fpyes = @ (x)双(x) / 1000;%把他们带回来
fpyes(相交(fpno ([1.1 - 2.2]), fpno (1.2: .1:3.4)))
但是我仍然不明白你将时间间隔定义为我不能得到相同的结果作为例子。
2的评论
肖恩·德Wolski
肖恩·德Wolski 2011年6月9日
那么你用增量定义一个“间隔”?

登录置评。


沃尔特·罗伯森
沃尔特·罗伯森 2011年6月9日
联盟和十字路口的间隔可以用min()和max()和适当的逻辑;我记得6年前实现逻辑(可能在perl中。)然而,我不需要担心开放与封闭间隔:表示和逻辑变得一团糟。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!