在MATLAB中寻找无for循环的最佳阈值电平

在MATLAB中寻找无for循环的最佳阈值电平,matlab,for-loop,threshold,Matlab,For Loop,Threshold,设A和B是两个大小相同的矩阵。对于矩阵M,让ht(M,t)将M的所有项设为t的阈值。也就是说,绝对值小于t的所有条目都设置为0。假设我想找到最佳阈值t,使得范数(ht(A,t)-B,'fro')^2最小化 我所能看到的唯一方法是有缺陷的:在a和阈值a的唯一值上执行for循环,并设置C=ht(a,t)-B,计算sum(sum(C.*C)) 当A很大时,这太慢了。我已经考虑过对A的元素进行排序,并找到一些有效的方法将一些条目一次设置为零,但我不确定这一切都可以在没有for循环的情况下完成 有办法吗

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

我所能看到的唯一方法是有缺陷的:在a和阈值a的唯一值上执行for循环,并设置C=ht(a,t)-B,计算sum(sum(C.*C))

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

有办法吗

下面是一个非常简单的示例(因此简单的for循环在这种情况下很容易工作):

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

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

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

您能给出示例输入数据并列出预期的输出吗?当然,请给我一分钟。您可以使用二进制搜索来查找阈值,而不是检查每个唯一的值。我不确定是否存在一种有效的方法来找到一般情况下的最优解。我不确定你的意思。因为范数(ht(A,t)-B,'fro')^2甚至不能保证有一个局部最小值,那会有什么效果呢?我的直觉是,除了通过迭代搜索来寻找最佳点之外,没有简单的解决方案。我不确定该建议哪种算法,但我会研究非线性优化算法。发布一个链接到您的数据可能会让我们更好地了解应该尝试哪些技术。这里的n是什么,a的前导维度?@GregorianFunk a中的元素数。将a和B矢量化。我认为这并没有真正的帮助,因为对于一个平方p乘以p的矩阵,这是O(p^2 log p),无论如何都是通过for循环完成的(除非您提出其他建议)。所以我不知道你在回答这个问题。@GregorianFunk true。但我认为在实践中会快得多。你能给我们看一下你的代码让我们比较一下吗?
function [A_thresholded] = ht(A,t)
%
A_thresholded = A .* (abs(A)>t);