利用均方误差在matlab中生成索引矩阵

利用均方误差在matlab中生成索引矩阵,matlab,Matlab,均方误差(MSE)是一种用于定义两个块之间差异的方法,可按如下方式计算: a和b两个块大小相等 MSE = sqrt(sum(sum((a-b).^2)))/size(a or b) 如果MSE小于给定阈值,则两个块没有差异 给定两个矩阵A和B,目的是将两个矩阵划分为给定大小的块,然后从A中提取第一个块,并将其设为A,然后从b中搜索块b,其中a和b之间的均方误差小于给定阈值,然后从矩阵b返回块b的位置。等等下面是一个例子: 给定两个矩阵A和B,其中: A= [1 1 4 4 2 2

均方误差
(MSE)是一种用于定义两个块之间差异的方法,可按如下方式计算:
a
b
两个块大小相等

MSE = sqrt(sum(sum((a-b).^2)))/size(a or b)
如果
MSE
小于给定阈值,则两个块没有差异

给定两个矩阵
A
B
,目的是将两个矩阵划分为给定大小的块,然后从A中提取第一个块,并将其设为
A
,然后从
b
中搜索块
b
,其中
a
b
之间的
均方误差小于给定阈值,然后从矩阵
b
返回块
b
的位置。等等下面是一个例子:

给定两个矩阵
A
B
,其中:

A= [1 1   4 4   2 2 
    1 1   4 4   2 2

    2 2   9 9   5 5
    2 2   9 9   5 5

    3 3   4 4   9 9
    3 3   4 4   9 9];

B = [ 2 2   4 4   9 9
      2 2   4 4   9 9];
阈值为2

从矩阵
a
获得的第一个块
a
是:

1 1
1 1
从矩阵
b
获得的
a
b
之间的MSR小于阈值的块
b
为:

2 2
2 2
因此,我们返回块
b
在矩阵
b
中的位置,即1

从矩阵
a
获得的第二块
a
是:

4 4
4 4
从矩阵
b
获得的块
b
,其中
a
b
之间的MSR小于阈值为:

4 4
4 4
因此,我们返回块
b
在矩阵
b
中的位置,即2。等等

最终结果如下

RES= [1 2 1
      1 3 2
      1 2 3];

有没有更快的方法?

这里有一个矢量化的方法,可以使用

首先定义数据:

A = [1 1   4 4   2 2 
     1 1   4 4   2 2
     2 2   9 9   5 5
     2 2   9 9   5 5
     3 3   4 4   9 9
     3 3   4 4   9 9];  %// data: A
B = [2 2   4 4   9 9
     2 2   4 4   9 9];  %// data: B
m = 2;                  %// number of rows per block
n = 2;                  %// number of cols per block
然后应用以下步骤:

  • 重塑矩阵,使每个块成为一行(灵感来源于)
  • 计算所有块对的MSE
  • 查找与
    B
    块相关的MSE的argmin(对于
    A
    的每个块)。请注意,如果
    B
    中有多个最小化块,则会找到第一个
  • 将结果重塑为矩阵
  • 代码:

    A2 = reshape(permute(reshape(A, size(A, 1), n, []), [2 1 3]), n*m, []);  %// step 1
    B2 = reshape(permute(reshape(B, size(B, 1), n, []), [2 1 3]), n*m, []);
    mse = squeeze(sum(bsxfun(@minus, A2, permute(B2,[1 3 2])).^2, 1));       %// step 2
    [~, result] = min(mse, [], 2);                                           %// step 3
    result = reshape(result, size(A,1)/m, size(A,2)/n);                      %// step 4