矩阵重新排列——sortrows函数

s o r t r o w s sortrows sortrows函数依据某列的属性对其元素所在的行进行排序从而进行矩阵的排序

  • s o r t r o w s sortrows sortrows函数常用方法:
    1. 1. 1. s o r t r o w s ( a , [ c 1 , c 2 ] ) sortrows(a,[c_1,c_2]) sortrows(a,[c1,c2]),( c i c_i ci可依据矩阵延续)先基于矩阵第 c 1 c_1 c1列升序排序,若第 c 1 c_1 c1列上有两元素相同,将它们所在的行基于 c 2 c_2 c2列按升序排列,若 c 2 c_2 c2列上仍有两元素相同,则按照元素出现的先后顺序进行排序;当对所有列都排序时,可简写成 s o r t r o w s ( a ) sortrows(a) sortrows(a)
    在这里插入图片描述

2. 2. 2. 对于不同列的不同升序或降序要求,可以用 s o r t r o w s ( a , [ c 1 , c 2 ] , sortrows(a,[c_1,c_2], sortrows(a,[c1,c2], { ′ d e s c e n d ′ , ′ a s c e n d ′ } \lbrace'descend','ascend'\rbrace {descend,ascend} ) ) )表达,表示将第 c 1 c_1 c1列按降序对矩阵排序,如果有元素相同,将它们所在的行按第 c 2 c_2 c2列升序排序,若 c 2 c_2 c2列上仍有两元素相同,则按照元素出现的先后顺序进行排序
在这里插入图片描述

3. 3. 3. s o r t sort sort函数一样, s o r t r o w s sortrows sortrows函数也有返回索引功能, s o r t r o w s sortrows sortrows函数返回的索引是某一行在原矩阵中处在第几行的位置,对以上各种操作都可以 [ s o r t r o w s a , i d ] = s o r t r o w s ( ) [sortrows_a,id]=sortrows( ) [sortrowsa,id]=sortrows()求索引,例如:
在这里插入图片描述

### 图像矩阵编码的实现方法 图像矩阵的编码是一种将二维图像数据转换为更紧凑形式的技术,目的是减少存储空间或传输带宽需求。以下是几种常见的图像矩阵编码方式及其具体实现方法: #### 1. 哈达玛矩阵编码 哈达玛矩阵编码通过特殊的矩阵分解技术来表示图像信号。这种方法的核心在于将原始哈达玛矩阵拆分为两个子矩阵——哈达玛正矩阵和哈达玛负矩阵[^1]。 - **原理**: 将哈达玛矩阵中的 `+1` 和 `-1` 元素分离出来形成两部分矩阵。 - **实现**: 使用 MATLAB 或其他编程工具完成矩阵运算,并对图像进行编码和解码操作。最终通过对测量值相减的方式恢复原始图像。 ```matlab % 创建哈达玛矩阵 hadamardMatrix = hadamard(8); % 生成一个8x8的哈达玛矩阵 % 提取正负矩阵 positiveMatrix = (hadamardMatrix == 1); negativeMatrix = (hadamardMatrix == -1); % 对图像进行编码 encodedImagePositive = positiveMatrix .* originalImage; encodedImageNegative = negativeMatrix .* originalImage; % 解码过程 decodedImage = double(encodedImagePositive) - double(encodedImageNegative); ``` --- #### 2. 算术编码 算术编码是一种高效的熵编码方法,能够显著降低冗余信息量。其核心思想是基于概率模型分配区间长度给不同符号[^2]。 - **原理**: 利用符号的概率分布构建累积频率表,在此基础上定义每个符号对应的实际数值范围。 - **实现**: 在 MATLAB 中可以调用自定义函数完成整个编解码流程。 ```matlab function decodedData = arithmeticDecode(encodedData, probabilities, imageSize) % 初始化变量... % 构建反向映射关系 cumulativeProbabilities = cumsum([0; probabilities]); % 开始逐位解析 resultMatrix = zeros(imageSize); currentIntervalStart = 0; currentIntervalWidth = 1; for i = 1:numel(encodedData) symbolIndex = findSymbol(cumulativeProbabilities, ... currentIntervalStart + encodedData(i)*currentIntervalWidth); % 更新状态机参数 selectedProbabilityRange = probabilities(symbolIndex); newIntervalStart = currentIntervalStart + ... (selectedProbabilityRange * currentIntervalWidth); newIntervalWidth = selectedProbabilityRange * currentIntervalWidth; % 存储当前找到的结果 rowIdx = floor((i-1)/size(resultMatrix,2)) + 1; colIdx = mod(i-1,size(resultMatrix,2)) + 1; resultMatrix(rowIdx,colIdx) = symbolIndex; % 迭代更新全局上下界 currentIntervalStart = newIntervalStart; currentIntervalWidth = newIntervalWidth; end end ``` --- #### 3. Huffman 编码 Huffman 编码属于变长编码的一种,适用于离散源的数据压缩场景。该算法依据各灰度级出现频次设计最优前缀树结构[^3]。 - **步骤概述**: - 统计输入图片中每种颜色分量(即亮度级别)的数量; - 根据这些统计结果构造一棵二叉权值树; - 遍历此树获取各个节点关联路径作为相应字符的新表达形式; ```matlab % 计算直方图 grayHistogram = imhist(grayImage); % 排序并建立霍夫曼字典 sortedFrequencies = sortrows(cell2mat(arrayfun(@(x)[find(grayHistogram==max(x)), grayHistogram(find(grayHistogram==max(x)))], 'UniformOutput', false))); huffDict = huffmandict(sortedFrequencies(:,1)', sortedFrequencies(:,2)'); % 应用霍夫曼编码 compressedBits = huffmanenco(double(grayImage(:)), huffDict); % 解压还原 reconstructedPixels = uint8(huffmandeco(compressedBits, huffDict)); reshapedReconstruction = reshape(reconstructedPixels, size(grayImage)); ``` --- #### 4. 游程长度编码(RLE) 当连续多个相同像素存在时,RLE 可有效缩短描述长度。尤其针对具有大面积同质区域的画面效果明显[^4]。 - **基本思路**: 替换重复序列为其首项加次数的形式呈现。 - 下面展示一段简单的 RLE 处理逻辑片段: ```matlab function rleEncoded = runLengthEncode(inputVector) [~, idxs, counts] = unique([inputVector inf],'first'); values = inputVector(idxs(end-1:-1:1)); % 获取唯一值得倒序排列 lengths = diff([0 idxs]); % 测定间隔距离代表数量多少 rleEncoded = [values(:), num2cell(lengths(:))]; end ``` --- ### 总结 以上介绍了四种主流的图像矩阵编码方案:分别是基于线性变换理论的哈达玛编码、依赖于精确数学公式的算术编码、遵循贪心策略优化原则的霍夫曼编码以及专门应对模式特征明显的游程长度编码法。它们各有优劣适用场合不尽相同需视具体情况选用最佳选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值