1

在 matlab 中,我有一个 128 x n 矩阵,我们可以称之为

[ABC]

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

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

[A~DE]。

其中 A~ 的值与 A 相似。作为 concat 的结果,我想要得到的是:

[ABCDE],

其中 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]' 

在某些情况下,值完全不同,但在大多数情况下,值是接近的。我对此没有明确的阈值,但理想情况下,这将是我可以试验的东西。

4

3 回答 3

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')';
于 2012-07-11T23:08:20.960 回答
0

为了解决这个问题,可以使用一种称为 vl_ubcmatch 的匹配算法。

[匹配,分数] = vl_ubcmatch(da, db) ; 对于 da 中的每个描述符,vl_ubcmatch 会在 db 中找到最接近的描述符(通过它们之间差异的 L2 范数来衡量)。原始匹配的索引和最接近的描述符存储在匹配的每一列中,配对之间的距离存储在分数中。

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

因此,解决方案是找到得分最高的匹配列,并在连接之前将其消除。

于 2012-07-11T23:24:04.777 回答
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了解更多背景信息。

于 2012-07-12T06:22:56.540 回答