查找第一个元素最近的行

Posted

技术标签:

【中文标题】查找第一个元素最近的行【英文标题】:Find row with closest first element 【发布时间】:2016-01-02 12:50:24 【问题描述】:

我有一个像

这样的矩阵
a = [ 4.1    45    65    84    84 , 
      4.2    62    78    83    43 , 
      4.3    84    94    93    94 ]

还有一个类似的向量

b = [ 4.123  4.21   4.31   4.19 ] 

对于向量b 中的每个元素,我想在a 中找到第一列中的元素最接近b 中的该元素的行。 最后想把b的元素和对应的行串联起来,组成一个新的矩阵c

所以最终的矩阵看起来像

c = [ 4.123   45    65    84    84 ,
      4.21    62    78    83    43 , 
      4.31    84    94    93    94 ,
      4.19    62    78    83    43 ]

【问题讨论】:

【参考方案1】:

您可以使用bsxfun 函数创建一个矩阵,其中包含b 中每个元素与a 第一列每个元素之间的差异:

bsxfun(@minus,b,a(:,1))
ans =
   -0.0230   -0.1100   -0.2100   -0.0900
    0.0770   -0.0100   -0.1100    0.0100
    0.1770    0.0900   -0.0100    0.1100

矩阵的每一行对应a(:,1)中的一个元素,每一列对应b中的一个元素。即元素(3,1) 等于b(1)-a(3,1)

要找到最接近的值,让我们查看绝对值abs() 并使用min 函数找到每列的最小值。 min的第一个返回值是每一列的最小值,第二个返回值是索引。我们只需要索引,所以我们使用~丢弃第一个返回值。

[~,minRow] = min(abs(bsxfun(@minus,a(:,1),b)))
minRow =
     1     2     3     2

我们现在知道,我们必须使用a 的哪一行,所以我们可以通过将ba 的正确行连接成一个矩阵来构造矩阵:

c = [ b.', a(minRow,2:end) ];
c =
    4.1230   45.0000   65.0000   84.0000   84.0000
    4.2100   62.0000   78.0000   83.0000   43.0000
    4.3100   84.0000   94.0000   93.0000   94.0000
    4.1900   62.0000   78.0000   83.0000   43.0000

【讨论】:

以上是关于查找第一个元素最近的行的主要内容,如果未能解决你的问题,请参考以下文章

在SQL中查找最近的行

iOS:如何传递节中的行索引

matlab如何将两个矩阵的指定元素相加放入一个空矩阵中

在排除某些行的矩阵的列中查找最大元素

Linux vim的命令模式

从sql数据库第2行第4列获取数据