在矩阵列中找到每个组中最接近的值

时间:2019-03-18 18:09:06

标签: matlab

这是另一个基于相同矩阵数据的运算,正如我在上一个问题中所谈到的。我有一个如下的矩阵。

a = [1.05 2.1 3.4 1; 1.06 2.2 3.6 1; 2.04 2.3 3.8 2; 2.15 2.2 4.0 2; 1.37 2.3 3.7 1;3.12 2.1 4.1 3;3.02 2.2 4.2 3;3.42 2.3 4.5 3;3.24 2.4 4.8 3]

a =

1.0500    2.1000    3.4000    1.0000
1.0600    2.2000    3.6000    1.0000
2.0400    2.3000    3.8000    2.0000
2.1500    2.2000    4.0000    2.0000
1.3700    2.3000    3.7000    1.0000
3.1200    2.1000    4.1000    3.0000
3.0200    2.2000    4.2000    3.0000
3.4200    2.3000    4.5000    3.0000
3.2400    2.4000    4.8000    3.0000

a(:,4)是组号。根据组号,我将矩阵数据分为3组:1、2和3。

我想在每个组中的((,, 2) 中找到最接近2.2的值的索引。从数据中可以看到,第2行中的2.2属于组1,第4行中的2.2属于组2,第7行中的2.2属于组3。

我的代码如下所示:

[minValue,closestIndex] = splitapply(@(x)min(abs(2.2-x)), a(:,2), findgroups(a(:,4)))

结果是:

minValue =

 0
 0
 0

从数据中我们可以发现这是一致的。

closestIndex =

 2
 2
 2

这应该是矩阵中三个2.2的索引,分别是2、4和7。但是结果是2、2和2。

我的代码有什么问题?

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为您误解了此功能的工作原理。它拆分了您的初始设置:

a =

1.0500    2.1000    3.4000    1.0000
1.0600    2.2000    3.6000    1.0000
2.0400    2.3000    3.8000    2.0000
2.1500    2.2000    4.0000    2.0000
1.3700    2.3000    3.7000    1.0000
3.1200    2.1000    4.1000    3.0000
3.0200    2.2000    4.2000    3.0000
3.4200    2.3000    4.5000    3.0000
3.2400    2.4000    4.8000    3.0000

x1=
1.0500    2.1000    3.4000    1.0000
1.0600    2.2000    3.6000    1.0000 (index = 2)
1.3700    2.3000    3.7000    1.0000
x2=
2.0400    2.3000    3.8000    2.0000
2.1500    2.2000    4.0000    2.0000 (index = 2)
x3=
3.1200    2.1000    4.1000    3.0000
3.0200    2.2000    4.2000    3.0000 (index = 2)
3.4200    2.3000    4.5000    3.0000
3.2400    2.4000    4.8000    3.0000

索引是单独检查的,因此确实-2,2,2是此查询的正确答案。根据文档“ splitapply函数每组调用一次func”,因此不可能直接从初始矩阵获取索引。也许您可以通过添加另一列(如1 2 3 4 5 6 7 8 9并以这种方式存储其中的数字)来解决该问题,但这并不是那么优雅,并且需要相当复杂的func