对于以下等式:
我们是否在MATLAB
中写下如下:
sum=0;
for j=1:k
for i=1:n
sum = sum + (u(i,j)*log2(u(i,j)+(1-u(i,j)*log2(1-u(i,j)))))/n;
end
end
result = -1 * sum;
感谢。
答案 0 :(得分:2)
引用Jongware: 不,我们不是这样做的!
你宁愿写:
fun = @(x) x*log2(x)+(1-x)*log2(1-x);
result = -1/n*sum( arrayfun(fun,u(:)) )
答案 1 :(得分:1)
以下是我写这个的方法:
在Matlab中,我们倾向于避免循环。
考虑到等式的形式,两个总和可以合并为一个。在Matlab中,我们可以使用linear indexing。
将n
移出总和以减少操作次数。
所以:
H = -sum(u(:).*log2(u(:))+(1-u(:)).*log2(1-u(:)))/n;
另一方面,在您的代码中:
你有一些括号错了。计算出的值不是等式给出的值。
您应该避免使用i
和j
作为变量名称,因为它们会覆盖虚构单位(请参阅here)。
您应该避免使用sum
作为变量名称,因为它会覆盖Matlab的bulit.in函数sum
。
答案 2 :(得分:0)
sum=0;
for i=1:k
for j=1:n
sum = sum + (u(i,j)*log2(u(i,j)+(1-u(i,j)*log2(1-u(i,j)))))/n;
end
end
result = -1 * sum;