我有一个mxn
矩阵A,有非常小或非常大的元素例如:
A = -1e4*randn(10,20);
我想创建一个相同大小的新矩阵C,如下所示:
首先,定义一个矩阵B,其元素是a的元素的指数:
B = exp(A)
然后,定义矩阵C,使得C的每一列与B的相应列成比例,并且C的每一列之和等于1换言之,如果取B的一个元素除以同一列的所有元素之和,则得到C的相应元素:
C = bsxfun(@rdivide,B,sum(B));
数学上:
显然,C的所有元素都在0到1之间但是,当使用以下代码进行计算时,获得的矩阵包含许多nan:
A = -1e4*randn(10,20);
B = exp(A);
C = bsxfun(@rdivide,B,sum(B));
sum(sum(isnan(ee)))
我希望有人能提出解决这个问题的方法非常感谢你。
更新:请注意,目标是矩阵C。我定义矩阵B只是为了解释,我们可能不需要计算它(其实我们不应该正如@EJG89指出的,B只包含Inf和0)。
更新2:感谢@EJG89提供Log Sum of Exponentials technique的链接,这可能很有用我正在为我的问题寻找类似的分析技巧。
更新3:根据@Dan和@EJG89的建议,我们可以用一个常数减去每一列,得到一个合理范围内的新矩阵显然,我们有
对于任何常数C,我们可以选择C作为每个列的最大值:
(最大的,最大的,最大的)
我觉得这个选择可能给出一个很好的近似,但我不知道它有多好:
新代码是:
A = bsxfun(@minus,A,max(A));
B = exp(A);
C = bsxfun(@rdivide,B,sum(B));
最佳答案
您想将A调整为一些新的A‘这样eA=CeA’,其中C是一个常数(远远小于1)换句话说,你正在寻找一些k,使得k.eA足够小,不会破坏ndoublemax
或eps
但是我们想把这个k应用到A上,所以我们需要把它转化为指数k=eln(k)和eln(k),eA=eA+ln(k),因此,如果我们从A
中加上或减去一个数,eA就成比例地受到影响或A’=A+ln(k)
不幸的是,我认为你的射程太大,任何ln(k)都无法阻止你突破Matlab双打的极限如果你加一个大数,你会得到所有的B
等于inf
,如果你减去一个大数,你会得到所有的B
等于零。
所以你需要找到一些同时处理大数和分数的方法。
关于matlab - 同时处理大量数字和分钟数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24803925/