我正在尝试每列的熵,矩阵看起来像这样:
0.5 0.3333 0.2
0 0.3333 0.4
0.5 0.3333 0.4
每个列加起来一个,但是,矩阵中有一些零,所以如果我只是log2(arr(i,:)),结果中会有一个-Inf,所以整个事情都行不通
在实践中我有一个巨大的矩阵,所以我希望程序运行得很快,是否有解决方法?
这是我的解决方案,它的工作速度与p。* log2(p)一样快吗?
log2p = log2(p);
log2p(log2p==-Inf)=0;
entropy = entropy - p .* log2p;
答案 0 :(得分:1)
在MATLAB中0^0
等于1
。从log2(1)==0
开始,你可以使用它并将你的熵函数重写为
p.*log2(p) = log2(p.^p)
然后为你的例子我们得到
>> log2(p.^p)
ans =
-0.5000 -0.5283 -0.4644
0 -0.5283 -0.5288
-0.5000 -0.5283 -0.5288
答案 1 :(得分:0)
使用isinf
log2p = log2(p);
log2p( isinf(log2p) ) = 0;
entrpoy = -sum( p.*log2p , 1 )
答案 2 :(得分:0)
使用eps
:
eps是float中的最小可表示数字,因此您的结果不会发生太大变化(几乎无限小变化)。
log2(p)
ans =
-1.0000 -1.5851 -2.3219
-Inf -1.5851 -1.3219
-1.0000 -1.5851 -1.3219
log2(p+eps)
ans =
-1.0000 -1.5851 -2.3219
-52.0000 -1.5851 -1.3219
-1.0000 -1.5851 -1.3219
p2=p+eps;
entropy=-sum(p2.*log2(p2),1)
entropy =
1.0000 1.5849 1.5219
答案 3 :(得分:0)
您可以将isnan
与0*-inf==NaN
:
E = p.*log2(p);
valid = ~isnan(E);
entropy(valid) = entropy(valid) - E(valid);
clear E valid
如找到here,如果你的MATLAB比R2007a更新,这应该没有警告。