假设我有一个矩阵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];
So, B= [5 6 4 4 3];
C= [11 12 12];
D= [30 33 32];
在此,根据值的接近程度将矩阵分为三部分。因此,尽管我要从每个矩阵中得出的结果是相同的,但要根据其数字的接近程度将其分开,所以此矩阵的标准与上一个矩阵不同。有什么方法可以指定一组通用条件来使条件动态而不是静态?
答案 0 :(得分:1)
恐怕,我的回答对您来说太迟了,但是也许将来遇到类似问题的读者也可以从中受益。
通常,您的问题要求使用cluster analysis。不过,也许有一个更简单的解决方案可以解决您的实际问题。这是我的方法:
sort
个输入A
。 diff
计算A
的相邻元素之间的差异。median
。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
}
希望有帮助!