2. 費諾編碼實現的程式設計方向的選擇:遞迴or迴圈?
用遞迴方法實現費諾編碼,邏輯思路無疑是最清晰和最好理解的。
function [y]=fano(大小1xn的概率矩陣b)
***x; %
排序,分組,分配0、
1碼等操作
if(不滿足遞迴返回條件) %
遞迴返回判斷
fano(b的子矩陣1); %
以靠前的分組為新引數,呼叫自身
fano(b的子矩陣2); %
以靠後的分組為新引數,呼叫自身
endend
函式基本的邏輯描述:
求分組概率和a,求前i項累加概率,若大於a/2,分配0/1碼à對兩個新分組再呼叫自身。
遞迴返回條件的討論:(如何判斷某一分支的編碼已經完成)
遞迴程式設計雖然非常簡單直觀,便於理解,但是非常的吃記憶體,而且matlab也不贊成遞迴,無論是直接的,還是間接的。詳見:
(只關注概率行向量裡的某乙個元素的編碼,在編碼過程中,對之進行」追蹤」,得到其費諾編碼。同樣的過程,對概率行向量裡的每個元素都進行一遍,即可得到所有元素的費諾編碼。
3. 用雙重迴圈實現費諾編碼的過程及步驟
用乙個while迴圈解決分組內元素數目大於2的情況
分組元素數目等於2時,另行處理
(分組內數目數目等於1時,其編碼在上一次分組時已經完成,故而不討論)
4. 不等長的費諾編碼的碼字儲存問題
解決辦法:利用
matlab
的字元向量元胞陣列
1. 將元胞字元向量轉化為一般字元向量(cell2mat)
char=cell2mat(c);
2. 對轉化後的字元向量執行連線』0』或者』1』的操作
char=[char '0'];或者char=[char '1'];
3. 將操作完成後的一般字元向量重新賦給元胞字元向量
c=;程式設計思路:
1.引數a為待編碼的概率行向量,b為a的降序排序
2.用陣列z來儲存b中各個元素所在分組的元素總數(初始值為b的長度)
3.用m、n記錄b中當前正在編碼的元素所在的分組的起始和終止位置
4.用空的元胞字元向量陣列c存放編碼的碼字(c的長度等於b的長度)
實現**:function y=fano_code(a)
b=fliplr(a);
[m,n]=size(b);
m=1;
n=n;
z=ones(1,n).*n;
for j=1:n
c(j)=;
endfor i=1:n
while(z(i)>2)
a=sum(b(1,m:n),2)/2;
for k=m:n
if sum(b(1,m:k),2)>=a
if i<=k
char=cell2mat(c(i));
char=[char '0'];
c(i)=;
n=k;
z(i)=n-m+1;
break;
else
char=cell2mat(c(i));
char=[char '1'];
c(i)=;
m=k+1;
z(i)=n-m+1;
break;
endend
endend
if z(i)==2
if i==m
char=cell2mat(c(i));
char=[char '0'];
c(i)=;
else
char=cell2mat(c(i));
char=[char '1'];
c(i)=;
endend
m=1;
n=n;
endcelldisp(c);
end
雙重while迴圈實現列印數字11 99
問題 為什麼下面的while雙重迴圈是這樣的結果?x 1 y 1while true while y 9 x x 1 y y 1 print x 10 y 執行結果 分析 這是程式執行流程 x 2,y 2,x 10 y 22 x 3,y 3,x 10 y 33 x 9,y 9 y之前為8,符合內層迴...
小程式雙重for迴圈實現tab切換小demo
pages test test.js page clickhandle e 生命週期函式 監聽頁面載入 onload function options console.log a,b this.setdata console.log this.data.a,jjj 生命週期函式 監聽頁面初次渲染完成...
怎樣用matlab實現do while
matlab 中的while迴圈只有 while statement end 這種迴圈結構。有時候由於問題的需要,使用do.while 結構能夠更好的解決問題。其實仔細分析一下,do while 的結構就是可以保證先執行一次操作,再進行判斷。而while 條件 是先對條件進行判斷來決定是否採取相應的...