matlab - 如何根据值的接近程度拆分矩阵?
问题描述
假设我有一个矩阵A
:
A = [1 2 3 6 7 8];
我想根据数字的相对接近程度将此矩阵拆分为子矩阵。例如,上面的矩阵必须拆分为:
B = [1 2 3];
C = [6 7 8];
我知道我需要为这个分组定义某种标准,所以我想我会取数字与其下一个数字的绝对差,并定义一个数字允许在一个组中的限制。但问题是我无法确定差异的静态限制,因为矩阵和子矩阵会发生变化。
另一个例子:
A = [5 11 6 4 4 3 12 30 33 32 12];
因此,这必须拆分为:
B = [5 6 4 4 3];
C = [11 12 12];
D = [30 33 32];
在这里,矩阵根据值的接近程度分为三个部分。所以这个矩阵的标准与前一个不同,尽管我想从每个矩阵中得到的都是相同的,根据它的数字的接近程度来区分它。有什么方法可以指定一组通用条件来使标准动态而不是静态?
解决方案
恐怕我的回答对你来说来得太晚了,但也许未来有类似问题的读者可以从中受益。
一般来说,您的问题需要聚类分析。不过,对于您的实际问题,也许有一个更简单的解决方案。这是我的方法:
- 首先,
sort
输入A
。 - 为了找到区分“类内”和“类间”元素的标准,我使用 计算 的相邻元素之间的
A
差异diff
。 - 然后,我计算
median
所有这些差异。 - 最后,I
find
是所有差异的指数,它们大于或等于中位数的三倍,最小差异为1
. (根据实际数据,这可能会被修改,例如使用mean
代替。)这些是索引,您必须在其中“拆分”(排序的)输入。 - 最后,我为每个“子矩阵”设置了两个带有起始索引和结束索引的向量,以使用这种方法
arrayfun
来获取具有所有所需“子矩阵”的单元格数组。
现在,代码来了:
% Sort input, and calculate differences between adjacent elements
AA = sort(A);
d = diff(AA);
% Calculate median over all differences
m = median(d);
% Find indices with "significantly higher difference",
% e.g. greater or equal than three times the median
% (minimum difference should be 1)
idx = find(d >= max(1, 3 * m));
% Set up proper start and end indices
start_idx = [1 idx+1];
end_idx = [idx numel(A)];
% Generate cell array with desired vectors
out = arrayfun(@(x, y) AA(x:y), start_idx, end_idx, 'UniformOutput', false)
由于未知数量的可能向量,我想不出将这些“解包”为单个变量的方法。
一些测试:
A =
1 2 3 6 7 8
out =
{
[1,1] =
1 2 3
[1,2] =
6 7 8
}
A =
5 11 6 4 4 3 12 30 33 32 12
out =
{
[1,1] =
3 4 4 5 6
[1,2] =
11 12 12
[1,3] =
30 32 33
}
A =
1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3
out =
{
[1,1] =
1 1 1 1 1 1 1
[1,2] =
2 2 2 2 2 2
[1,3] =
3 3 3 3 3 3 3
}
希望有帮助!