在MATLAB中没有for循环的情况下找到最佳阈值水平

时间:2015-03-23 22:25:09

标签: matlab for-loop threshold

设A和B为相同大小的两个矩阵。对于矩阵M,让ht(M,t)将M的所有条目阈值t。也就是说,绝对值小于t的所有条目都设置为0.假设我想找到最佳阈值t,使得norm(ht(A,t)-B,'来自')^ 2是最小化。

我能看到这样做的唯一方法是缺陷:对A和阈值A的唯一值进行for循环,并设置C = ht(A,t)-B,计算和(sum(C *) C))。

当A很大时,这太慢了。我已经考虑过对A的元素进行排序,并找到一种有效的方法,一次将几个条目设置为零,但我不确定如果没有for循环,这一切都可以完成。

有办法吗?

这是一个非常简单的例子(在这种情况下,简单的for循环很容易):

B =

     0.101508820368332                         0
                     0         0.301996943246957

Set

A=B+.1*ones(2)

A =

         0.201508820368332                       0.1
                       0.1         0.401996943246957

简单检查表明,如果我们将A的非对角线条目归零,我们将A和B之间的差异最小化。有3个可能的阈值,由唯一(A)= [。1,.2015,.402给出]。给定潜在的阈值t,我们可以通过以下方式确定阈值A:

function [A_thresholded] = ht(A,t)
%
A_thresholded = A .* (abs(A)>t);

1 个答案:

答案 0 :(得分:0)

矩阵中数据的形式无关紧要。您可以将它们转换为向量并简单地计算平方范数。实际上,您可以按递增顺序对A的内容进行排序(并置换B以保持配对)。当您增加阈值以在A中包含一个以上的值时,范数仅会更改一个增量。因此,您可以在O(n log n)中找到您的解决方案。希望这会有所帮助。