1

我试图对每一列的熵,矩阵看起来像这样:

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;
4

4 回答 4

1

在 MATLAB0^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
于 2013-07-01T08:49:10.737 回答
0

您可以isnan结合以下事实使用0*-inf==NaN

E = p.*log2(p);

valid = ~isnan(E);
entropy(valid) = entropy(valid) - E(valid);

clear E valid 

如发现这里,如果您的 MATLAB 比 R2007a 更新,这应该可以在没有警告的情况下工作。

于 2013-07-01T08:28:22.720 回答
0

利用isinf

log2p = log2(p);
log2p( isinf(log2p) ) = 0;
entrpoy = -sum( p.*log2p , 1 )
于 2013-07-01T05:57:04.903 回答
0

使用eps

eps 是浮点数中的最小可表示数字,因此您将获得结果而不会发生太大变化(几乎是无限小的变化)。

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
于 2013-07-01T08:06:01.743 回答