垂直连接矩阵时忽略类似的列

时间:2012-07-11 23:00:38

标签: matlab matrix distance similarity concat

在matlab中我有一个128乘n矩阵,我们可以调用

  

[A B C]

其中每个字母是128 x 1矩阵。

所以我想做的是将上面的矩阵与另一个矩阵连接,

  

[A~D E]。

其中A~的值与A相似。  我想得到的结果是:

  

[A B C D E],

其中省略了A~。

最好的方法是什么?请注意,我事先并不知道A~是相似的。

为了澄清,我的问题是我如何确定两列是否相似?类似地,我的意思是两列之间的位置,许多行值的值接近。

也许插图也有帮助

Vector A: [1  2   3 4 5 6 7 8   9]'
           |  |   | | | | | |   | 
Vector B: [20 2.4 4 5 0 7 7 7.6 10]' 

在某些情况下,值完全不同,但大多数情况下值都很接近。我没有为此定义的阈值,但理想情况下,这将是我可以尝试的东西。

3 个答案:

答案 0 :(得分:0)

如果您只想省略相同的列,这是一种方法:

%# Define the example matrices.

Matrix1 = [ 1 2 3; 4 5 6; 7 8 9 ]';

Matrix2 = [ 4 5 6; 7 8 10 ]';

%# Concatenate the matrices and keep only unique columns.

OutputMatrix = unique([ Matrix1, Matrix2 ]', 'rows')';

答案 1 :(得分:0)

要解决此问题,可以使用名为vl_ubcmatch的匹配算法。

  

[matches,scores] = vl_ubcmatch(da,db);对于da中的每个描述符,   vl_ubcmatch在db中找到最接近的描述符(由L2测量)   他们之间差异的规范)。原始匹配的索引   并且最接近的描述符存储在每列匹配中   该对之间的距离存储在分数中。

源: http://www.vlfeat.org/overview/sift.html

因此,解决方案是找到具有最高分数的匹配列,并在连接之前消除它们。

答案 2 :(得分:0)

我认为你需要pdist2。 请考虑以下示例:

>> X = rand(25, 5); 
>> Y = rand(100, 5); 
>> Y(22, : ) = 0.99*X(22,:); 
>> D = pdist2(X,Y, 'euclidean'); 
>> [~,ind] = min(D(:)); 
>> [i,j]=ind2sub(size(D),ind)

    i = 
        22
    j = 
        22

这确实是我们操纵的类似的条目。阅读help pdist2doc pdist2了解更多背景信息。