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