Mean Square Error(MSE)
是一种用于定义两个块之间差异的方法,可以按如下方式计算:a
和b
两个块大小相等
MSE = sqrt(sum(sum((a-b).^2)))/size(a or b)
如果MSE
小于给定的阈值,则两个块没有差别。
给定矩阵A
,已经重新整形为包含所有相同原始的块,
目的是提取MSE
小于给定阈值的所有块(基于第一个块),然后返回这些块的平均值。再次,提取MSE
小于给定阈值的第二组块,其中必须不再提取已经分配为其他块组的一部分的块。更好的是,必须删除它以减少搜索时间。依此类推,直到矩阵A
的所有块都被指定为组的一部分。这是一个例子:
给定矩阵A
,A
的大小为2乘14:
A= [1 1 2 2 9 9 4 4 6 6 5 5 3 3
1 1 2 2 9 9 4 4 6 6 5 5 3 3];
PS:没有必要这些块包含相同的数字,只是为了使示例清晰。
块大小为:2乘2
阈值为2
现在我们从矩阵MSE
中的第一个块开始提取A
小于阈值的所有块。这些块是:
1 1 2 2 3 3
1 1 2 2 3 3
这些街区的平均值是
Result= [ 2 2
2 2];
一次。我们提取MSE
小于阈值的所有块,但是我们需要避免已经提取的块,所以第二组块是:
9 9
9 9
这个区块的意思是它自己,所以:
Result= [2 2 9 9
2 2 9 9];
一次。我们提取MSE
小于阈值的所有块,但是我们需要避免已经提取的块,所以第三组块是:
4 4 6 6 5 5
4 4 6 6 5 5
块
3 3
3 3
即使MSE
小于阈值,也不属于该群组,因为已经将其提取为第一组的一部分。
这些街区的意思是:
5 5
5 5
因此结果应为:
Result= [2 2 9 9 5 5
2 2 9 9 5 5];
有什么快速的方法可以应用吗?
答案 0 :(得分:1)
这是我的解决方案:
A = [1 1 2 2 9 9 4 4 6 6 5 5 3 3
1 1 2 2 9 9 4 4 6 6 5 5 3 3];
blockLen = 2;
MSEthresh = 1;
nBlocks = size(A,2) / blockLen;
meanBlocks = [];
bSelectRefBlock = true;
while(~isempty(A))
if(bSelectRefBlock)
%// Select new reference block
refBlock = A(:, 1:blockLen);
bSelectRefBlock = false;
A = A(:, blockLen+1:end);
iBlock = 1;
selectedBlocks = refBlock;
else
if(iBlock > size(A,2))
%// End of A reached. Compute mean of selected blocks
blockCols = reshape(selectedBlocks, [numel(refBlock) numel(selectedBlocks)/numel(refBlock)]);
meanBlockCols = mean(blockCols, 2);
meanBlocks(:, end+1:end+blockLen) = reshape(meanBlockCols, [size(refBlock, 1) blockLen]);
bSelectRefBlock = true;
else
%// Test next block with MSE and select if below threshold
MSE = sqrt(sum(sum((A(:, iBlock:(iBlock+blockLen-1)) - refBlock).^2))) / numel(refBlock);
if(MSE <= MSEthresh)
selectedBlocks(:, end+1:end+blockLen) = A(:, iBlock:(iBlock+blockLen-1));
A(:, iBlock:(iBlock+blockLen-1)) = [];
else
iBlock = iBlock + blockLen;
end
end
end
end
%// Compute mean of selected blocks for last group
blockCols = reshape(selectedBlocks, [numel(refBlock) numel(selectedBlocks)/numel(refBlock)]);
meanBlockCols = mean(blockCols, 2);
meanBlocks(:, end+1:end+blockLen) = reshape(meanBlockCols, [size(refBlock, 1) blockLen]);