国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如和使用matlab實(shí)現(xiàn)香農(nóng)編碼和解碼

這篇具有很好參考價(jià)值的文章主要介紹了如和使用matlab實(shí)現(xiàn)香農(nóng)編碼和解碼。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

在網(wǎng)上看了好多 , 都是對香農(nóng)進(jìn)行編碼的案例 , 卻沒有 進(jìn)行解碼的操作 , 今天就來補(bǔ)齊這個(gè)欠缺

效果截圖如下

如和使用matlab實(shí)現(xiàn)香農(nóng)編碼和解碼文章來源地址http://www.zghlxwxcb.cn/news/detail-476321.html

代碼解析

text = '你好';  % 待編碼的文本
  • 定義一個(gè)字符串類型的變量text,其值為’你好’。
[encoded, decoded, avgCodeLength, efficiency] = shannonCoding(text);
  • 調(diào)用函數(shù)shannonCoding對文本信息進(jìn)行編碼,并將編碼、解碼、平均碼長和編碼效率作為四個(gè)返回值保存到變量encoded, decoded, avgCodeLength和efficiency中。
disp('編碼結(jié)果:');
disp(encoded);
disp('解碼結(jié)果:');
disp(decoded);
disp('平均碼長:');
disp(avgCodeLength);
disp('編碼效率:');
disp(efficiency);
  • 打印輸出編碼結(jié)果、解碼結(jié)果、平均碼長和編碼效率。
function [encoded, decoded, avgCodeLength, efficiency] = shannonCoding(text)
  • 定義一個(gè)名為shannonCoding的函數(shù),輸入?yún)?shù)為待編碼的文本字符串text。輸出參數(shù)為編碼結(jié)果encoded、解碼結(jié)果decoded、平均碼長avgCodeLength和編碼效率efficiency。
symbols = unique(text);
freq = zeros(size(symbols));
for i = 1:length(symbols)
    freq(i) = sum(text == symbols(i));
end
freq = freq / numel(text);
  • 對于字符串text中所有不同的字符,使用unique()函數(shù)提取出來并存到symbols數(shù)組中,然后計(jì)算它們在字符串text中的出現(xiàn)頻率。具體來說,利用for循環(huán)遍歷symbols數(shù)組中的每一個(gè)字符,并計(jì)算其在字符串text中出現(xiàn)的次數(shù),最后將頻率存儲到freq數(shù)組中。最后,將freq數(shù)組中的每個(gè)元素除以總的字符數(shù)numel(text),即可得到每個(gè)字符的頻率。
cumProb = cumsum(freq);
  • 計(jì)算符號累計(jì)概率(按照符號出現(xiàn)概率從大到小排列)。
codeTable = cell(length(symbols), 2);
for i = 1:length(symbols)
    codeTable{i, 1} = symbols(i);
    codeTable{i, 2} = ''; % 初始化編碼為空
end
  • 初始化編碼表codeTable,用cell數(shù)組表示。codeTable的行數(shù)等于symbols中不同字符的個(gè)數(shù),每行有兩個(gè)元素:第一個(gè)是字符本身,第二個(gè)是該字符的編碼(最開始為空字符串)。
codeTable = buildCodeTable(codeTable, cumProb, 1, '');
  • 調(diào)用函數(shù)buildCodeTable遞歸地構(gòu)建Huffman編碼表。
encoded = '';
for i = 1:numel(text)
    symbol = text(i);
    index = find(strcmp(codeTable(:, 1), symbol));
    code = codeTable{index, 2};
    encoded = [encoded, code];
end
  • 遍歷文本text中的每個(gè)字符,找到對應(yīng)的Huffman編碼,最終將所有字符的編碼串聯(lián)起來,存儲在變量encoded中。
decoded = '';
code = '';
for i = 1:length(encoded)
    code = [code, encoded(i)];
    index = -1;
    for j = 1:length(codeTable)
        if strcmp(codeTable{j, 2}, code)
            index = j;
            break;
        end
    end
    if index >= 0
        decoded = [decoded, codeTable{index, 1}];
        code = '';
    end
end
  • 解碼過程,將encoded按照長度依次取出一部分,逐個(gè)檢查編碼表codeTable中是否有對應(yīng)的碼。如果有,則對應(yīng)的字符添加到decoded中,并清空code。
codeLengths = cellfun(@length, codeTable(:, 2));
avgCodeLength = sum(codeLengths .* freq);
  • 計(jì)算平均碼長,將每個(gè)字符的編碼長度乘以其在文本中的頻率,最后相加即可。
efficiency = 1 ./ avgCodeLength;
  • 計(jì)算編碼效率,用單位1表示所需的二進(jìn)制位數(shù),所以編碼效率是1除以平均碼長。這里使用了向量化操作,相當(dāng)于計(jì)算每個(gè)碼字所需的二進(jìn)制位數(shù)之和再除以總的碼字個(gè)數(shù)。
end
  • 函數(shù)定義結(jié)束。

完整代碼

text = '你好';  % 待編碼的文本
[encoded, decoded, avgCodeLength, efficiency] = shannonCoding(text);
disp('編碼結(jié)果:');
disp(encoded);
disp('解碼結(jié)果:');
disp(decoded);
disp('平均碼長:');
disp(avgCodeLength);
disp('編碼效率:');
disp(efficiency);
 
function [encoded, decoded, avgCodeLength, efficiency] = shannonCoding(text)
    % 計(jì)算字符頻率
    symbols = unique(text);
    freq = zeros(size(symbols));
    for i = 1:length(symbols)
        freq(i) = sum(text == symbols(i));
    end
    freq = freq / numel(text);
    
    % 計(jì)算累積概率
    cumProb = cumsum(freq);
    
    % 構(gòu)建編碼表
    codeTable = cell(length(symbols), 2);
    for i = 1:length(symbols)
        codeTable{i, 1} = symbols(i);
        codeTable{i, 2} = ''; % 初始化編碼為空
    end
    
    % 遞歸構(gòu)建編碼表
    codeTable = buildCodeTable(codeTable, cumProb, 1, '');
    
    % 編碼
    encoded = '';
    for i = 1:numel(text)
        symbol = text(i);
        index = find(strcmp(codeTable(:, 1), symbol));
        code = codeTable{index, 2};
        encoded = [encoded, code];
    end
    
% 解碼
decoded = '';
code = '';
for i = 1:length(encoded)
    code = [code, encoded(i)];
    index = -1;
    for j = 1:length(codeTable)
        if strcmp(codeTable{j, 2}, code)
            index = j;
            break;
        end
    end
    if index >= 0
        decoded = [decoded, codeTable{index, 1}];
        code = '';
    end
end

    
    % 計(jì)算平均碼長
    codeLengths = cellfun(@length, codeTable(:, 2));
    avgCodeLength = sum(codeLengths .* freq);
    
    % 計(jì)算編碼效率
    efficiency = 1 ./ avgCodeLength;
end
 
% 遞歸構(gòu)建編碼表
function codeTable = buildCodeTable(codeTable, cumProb, index, code)
    if index > length(codeTable)
        return;
    end
    
    if cumProb(index) <= 0.5
        codeTable{index, 2} = [code, '0'+' '];
        codeTable = buildCodeTable(codeTable, cumProb, index+1, [code, '0']);
    else
        codeTable{index, 2} = [code, '1'+' '];
        codeTable = buildCodeTable(codeTable, cumProb, index+1, [code, '1']);
    end
end
 
 

完結(jié) 撒花

到了這里,關(guān)于如和使用matlab實(shí)現(xiàn)香農(nóng)編碼和解碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【JS】實(shí)現(xiàn) Base64 編碼和解碼(及中文亂碼問題)

    JavaScript 定義了兩個(gè)與 Base64 相關(guān)的全局方法。 遇到中文編碼需要先做一次 URI 組件編碼或?qū)獯a后的內(nèi)容進(jìn)行 URI 解碼 示例:Base64 編碼 示例:Base64 解碼 中文亂碼處理方法: 按照 Base64 插件:編解碼: js-base64 ,判斷是否是Base64編碼格式: is-base64 插件使用

    2024年02月15日
    瀏覽(26)
  • 【算法】用c#實(shí)現(xiàn)自定義字符串編碼及圍欄解碼方法

    編寫一個(gè)函數(shù)/方法,它接受2個(gè)參數(shù)、一個(gè)字符串和軌道數(shù),并返回ENCODED字符串。 編寫第二個(gè)函數(shù)/方法,它接受2個(gè)參數(shù)、一個(gè)編碼字符串和軌道數(shù),并返回DECODED字符串。 然后使用圍欄密碼對其進(jìn)行解碼。 這種密碼用于通過將每個(gè)字符沿著一組“豎狀軌道”依次放在對角線

    2024年02月12日
    瀏覽(18)
  • IO流:java中解碼和編碼出現(xiàn)亂碼說明及代碼實(shí)現(xiàn)

    IO流:java中解碼和編碼出現(xiàn)亂碼說明及代碼實(shí)現(xiàn)

    如果采用的是UTF-8的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占3個(gè)字節(jié) 如果采用GBK的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占2個(gè)字節(jié) 其實(shí)idea和eclipse的默認(rèn)編碼方式是不一樣的哦。 idea默認(rèn)的編碼方式是:UTF-8 eclipse默認(rèn)采用的編碼方式是GBK 1、java中編碼的

    2024年02月08日
    瀏覽(23)
  • Linux系統(tǒng)下使用命令行進(jìn)行Base64編碼和解碼

    大家知道,編碼是將數(shù)據(jù)轉(zhuǎn)換為有效傳輸或存儲所需格式的過程。相反,解碼是將編碼數(shù)據(jù)轉(zhuǎn)換回其原始格式的過程。今天在這里向大家介紹一下 Base64 編碼和解碼,以便大家理解與學(xué)習(xí)。 Base64 是將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為 ASCII 的編碼方式之一。通常,當(dāng)二進(jìn)制數(shù)據(jù)傳輸?shù)綗o法正

    2024年02月11日
    瀏覽(39)
  • 13、ffmpeg使用nvidia顯卡對OAK深度相機(jī)進(jìn)行解碼和編碼

    基本思想:簡單使用nvidia的硬件解碼進(jìn)行oak相機(jī)的編碼和解碼學(xué)習(xí) 一、在本機(jī)rtx3060配置好顯卡驅(qū)動和cuda之后進(jìn)行下面操作50、ubuntu18.0420.04+CUDA11.1+cudnn11.3+TensorRT7.2/8.6+Deepsteam5.1+vulkan環(huán)境搭建和YOLO5部署_ubuntu18.04安裝vulkan_sxj731533730的博客-CSDN博客 二、配置環(huán)境和編譯庫

    2024年02月16日
    瀏覽(22)
  • SpringBoot項(xiàng)目整合OpenFeign、實(shí)現(xiàn)動態(tài)IP+URL請求、自定義(編碼器\解碼器)

    OpenFeign 是Spring Cloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過動態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類,實(shí)現(xiàn)類中. 啟動類加上注解: @EnableDiscoveryClient 動態(tài)URL 工具類: FeignUtils.class

    2024年02月02日
    瀏覽(28)
  • [Linux] 初識應(yīng)用層協(xié)議: 序列化與反序列化、編碼與解碼、jsoncpp簡單使用...

    [Linux] 初識應(yīng)用層協(xié)議: 序列化與反序列化、編碼與解碼、jsoncpp簡單使用...

    有關(guān)Linux網(wǎng)絡(luò), 之前的文章已經(jīng)簡單演示介紹了 UDP 、 TCP 套接字編程 相關(guān)文章: [Linux] 網(wǎng)絡(luò)編程 - 初見UDP套接字編程: 網(wǎng)絡(luò)編程部分相關(guān)概念、TCP、UDP協(xié)議基本特點(diǎn)、網(wǎng)絡(luò)字節(jié)序、socket接口使用、簡單的UDP網(wǎng)絡(luò)及聊天室實(shí)現(xiàn)… [Linux] 網(wǎng)絡(luò)編程 - 初見TCP套接字編程: 實(shí)現(xiàn)簡單的單

    2024年02月15日
    瀏覽(28)
  • opensl學(xué)習(xí)——base16編碼解碼、base64編碼解碼、ASCII碼表、擴(kuò)展ASCII碼

    opensl學(xué)習(xí)——base16編碼解碼、base64編碼解碼、ASCII碼表、擴(kuò)展ASCII碼

    ASCII(American Standard Code for Information Interchange,美國信息互換標(biāo)準(zhǔn)代碼)是一套基于拉丁字母的字符編碼,共收錄了 128 個(gè)字符,用一個(gè)字節(jié)就可以存儲,它等同于國際標(biāo)準(zhǔn) ISO/IEC 646。 ASCII 編碼于 1967 年第一次發(fā)布,最后一次更新是在 1986 年,迄今為止共收錄了 128 個(gè)字符,包

    2024年02月07日
    瀏覽(43)
  • BCH編碼與譯碼(MATLAB實(shí)現(xiàn))

    BCH編碼與譯碼(MATLAB實(shí)現(xiàn))

    BCH碼是由Bose、Chandhari 和 Hocquenhem 分別獨(dú)立提出的一種能夠糾正多個(gè)隨機(jī)錯(cuò)誤的循環(huán)碼。 BCH 碼的定義:給定任一有限域 GF(q)及其擴(kuò)域 GF(q m )(其中 q 為素?cái)?shù)或素?cái)?shù)冪),m 為某一正整數(shù),若碼元取自 GF(q) 循環(huán)碼的生成多項(xiàng)式 g(x) 的根集合 R 中有 σ-1 個(gè)連續(xù)根 α m0 , α m0+1 ,

    2024年01月20日
    瀏覽(64)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包