%親自驗證,絕對可用!
% Matlab實現離散通道容量的迭代演算法% 功能:利用迭代演算法計算離散通道的容量
%引數解釋
%C:通道容量
%P:轉移機率矩陣
%B:中間變數矩陣
%e: 通道容限,一般選0.00001
%X:輸入機率分佈
%n:迭代次數
function channel_cap(P, e)
n=0;
C=0;
C_0=0;
C_1=0;
[r,s]=size(P);
for i=1:r
if(sum(P(i,:))~=1)%檢測機率轉移矩陣是否行和為1.
error("機率轉移矩陣輸入有誤!!")
return;
end
for j=1:s
if(P(i,j)1)%檢測機率轉移矩陣是否負值或大於1
X=ones(1,r)/r;
A=zeros(1,r);
B=zeros(r,s);
while(1)
n=n+1;
B(i,j)=log(P(i,j)/(X*P(:,j))+eps);
A(1,i)=exp(P(i,:)*B(i,:)");
C_0=log2(X*A");
C_1=log2(max(A));
if (abs(C_0-C_1)
%親自驗證,絕對可用!
% Matlab實現離散通道容量的迭代演算法% 功能:利用迭代演算法計算離散通道的容量
%引數解釋
%C:通道容量
%P:轉移機率矩陣
%B:中間變數矩陣
%e: 通道容限,一般選0.00001
%X:輸入機率分佈
%n:迭代次數
function channel_cap(P, e)
n=0;
C=0;
C_0=0;
C_1=0;
[r,s]=size(P);
for i=1:r
if(sum(P(i,:))~=1)%檢測機率轉移矩陣是否行和為1.
error("機率轉移矩陣輸入有誤!!")
return;
end
for j=1:s
if(P(i,j)1)%檢測機率轉移矩陣是否負值或大於1
error("機率轉移矩陣輸入有誤!!")
return;
end
end
end
X=ones(1,r)/r;
A=zeros(1,r);
B=zeros(r,s);
while(1)
n=n+1;
for i=1:r
for j=1:s
B(i,j)=log(P(i,j)/(X*P(:,j))+eps);
end
A(1,i)=exp(P(i,:)*B(i,:)");
end
C_0=log2(X*A");
C_1=log2(max(A));
if (abs(C_0-C_1)