首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据值的接近程度来分割矩阵?

如何根据值的接近程度来分割矩阵?
EN

Stack Overflow用户
提问于 2019-04-13 16:05:45
回答 1查看 54关注 0票数 0

假设我有一个矩阵A

代码语言:javascript
复制
A = [1 2 3 6 7 8];

我想把这个矩阵分解成子矩阵,基于数字的相对接近程度。例如,必须将上述矩阵分解为:

代码语言:javascript
复制
B = [1 2 3];
C = [6 7 8];

我知道我需要为这个分组定义某种标准,所以我想我要取这个数字和它下一个的绝对差,并定义一个极限,这个极限允许一个数字在一个组中。但问题是,由于矩阵和子矩阵都会发生变化,所以我不能对差值进行静态限制。

另一个例子是:

代码语言:javascript
复制
A = [5 11 6 4 4 3 12 30 33 32 12];

因此,必须将其分为:

代码语言:javascript
复制
B = [5 6 4 4 3];
C = [11 12 12];
D = [30 33 32];

这里,根据值的接近程度将矩阵分为三个部分。因此,这个矩阵的标准与前一个不同,尽管我想从每个矩阵中得到的是相同的,根据它的数的贴近度来分离它。我是否可以指定一组一般的条件来使标准是动态的,而不是静态的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 10:48:54

恐怕,我的回答对你来说太迟了,但也许将来有类似问题的读者可以从中受益。

一般来说,您的问题需要聚类分析。尽管如此,也许有一个更简单的解决方案,您的实际问题。我的方法是:

  1. 首先,sort输入A
  2. 为了找到区分“类内”和“类间”元素的标准,我使用Adiff计算了相邻元素之间的差异。
  3. 然后,我计算所有这些差异的median
  4. 最后,我将所有差异的指数(大于或等于中值的三倍)与最小的find差相对应。(根据实际数据的不同,这可能会被修改,例如使用mean。)这些是索引,您必须在其中“拆分”(排序)输入。
  5. 最后,为每个“子矩阵”建立了具有起始和结束指标的两个向量,并利用方法利用arrayfun方法得到了一个包含所有“子矩阵”的单元数组。

现在,代码来了:

代码语言:javascript
复制
% 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)

由于未知数量的可能向量,我想不出如何“解压”这些到个别变量。

一些测试:

代码语言:javascript
复制
  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
  }

希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55667392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档