如何对熵计算进行矢量化?

时间:2013-07-01 05:40:19

标签: matlab vectorization probability-theory

我正在尝试每列的熵,矩阵看起来像这样:

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 个答案:

答案 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)

您可以将isnan0*-inf==NaN

这一事实结合使用
E = p.*log2(p);

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

clear E valid 

如找到here,如果你的MATLAB比R2007a更新,这应该没有警告。