?? geth.m
字號:
%利用Mackay的構造法1A構造校驗矩陣
function [H]=getH(m,n)
row_flag(1:m)=0;
h=zeros(m,n);
bits_per_col=3; %使每列隨機產生3個1即列重為3
for i=1:n
a=randperm(m);
for j=1:bits_per_col
h(a(j),i)=1;
row_flag(a(j))= row_flag(a(j))+1;
end
end
max_ones_per_row=ceil(n*bits_per_col/m); %求每行1的最多個數即行重的最大值
for i=1:m
if row_flag(i)==0
for k=1:2
j=unidrnd(m);
while h(i,j)==1
j=unidrnd(m);
end
h(i,j)=1;
row_flag(i)=row_flag(i)+1;
end
end
if row_flag(i)==1
j=unidrnd(m);
while h(i,j)==1
j=unidrnd(m);
end
h(i,j)=1;
row_flag(i)=row_flag(i)+1;
end
end
for i=1:m %嘗試在列上分散1的位置,使行重分布盡量均勻
j=1;
a=randperm(n);
while row_flag(i)>max_ones_per_row %如果該行行重大于行重的最大值,則進行處理
if h(i,a(j))==1 %隨機選擇某一該行上為1的列來處理,將改行上的1分散到其他行上
newrow=unidrnd(m); %隨機查找該列上適合放置1(行重小于最大值且該位置為0)的行
k=0;
while (row_flag(newrow)>=max_ones_per_row|h(newrow,a(j))==1)&k<m
newrow=unidrnd(m);
k=k+1;
end
if h(newrow,a(j))==0 %將待處理行的1放到找到的行上,并對兩行的行標志作相應的處理
h(newrow,a(j))=1;
row_flag(newrow)=row_flag(newrow)+1;
h(i,a(j))=0;
row_flag(i)=row_flag(i)-1;
end
end
j=j+1;
end
end
for loop=1:100 %常是刪除短環4
success=1;
for r=1:m
ones_position=find(h(r,:)==1);
ones_count=length(ones_position);
for i=[1:r-1,r+1:m]
common=0;
for j=1:ones_count
if h(i,ones_position(j))==1
common= common+1;
if common==1
a=ones_position(j); %兩列的第一個共同1元素
end
end
if common==2
success=0;
common=common-1;
if (round(rand)==0) %隨即決定保留前面的列還是后面的列
b=a; %保留后面的列,處理前面列上的第二個共同的1元素
a=ones_position(j);
else b=ones_position(j); %保留前面的列,處理后面列上的第二個共同的1元素
end
h(i,b)=3; %將該1置為3以使在以后的嘗試刪除中不用該值
newrow=unidrnd(m);
iteration=0;
while h(newrow,b)~=0 & iteration<5 %嘗試5次在待交換的列中隨機查找0
newrow=unidrnd(m);
iteration=iteration+1;
end
if iteration>=5 %超過5次則隨機查找非1的0或3
while h(newrow,b)==1
newrow=unidrnd(m);
end
end
h(newrow,b)=1; %將該列中找到的0或3置為1
end
end
end
end
if success %如果本次循環已不存在短環4(seccess=1),則結束循環loop
break
end
end
h=h==1; %用0替代剩余的3,并得到構造好的校驗矩陣H
H=h;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -