图像压缩
图像量化的操作是不可逆的。
2.霍夫曼编码(mat2huff.m,huff2mat.m)
注:hist用法
n = list(Y)
将向量Y中的元素分到10个等间隔的范围内,并返回每个范围内元素的个数作为一行向量。
如果Y是一个m x p的矩阵,hist将Y的每一列作为一个向量,并返回一个10 x p的矩阵n。n的每一列的值对应Y的该列。
n = hist(Y, x)
x是一个向量,返回x的长度个以x为中心的,Y的分布情况。
例如:如果x是一个5元素的向量,返回Y在以x为中心的,x长度个范围内数据直方分布。
注:如果更需要制定数值边界而不是中心,可以使用histc。
n = hist(Y, nbins)
nbins是一个范围,使用nbins间隔数。
[n,xout] = hist(...)
返回n和xout,包含有数目频率和间隔位置。可以使用bar(xout, n)来绘制直方图。
hist(...)
使用上述方法绘制没有输出的直方图。
hist(axes_handle)
使用exes_handle轴绘制,代替目前的轴(gca)
>> f=[119 123 168 119;123 119 168 168];
>> f=[f;119 119 107 119;107 107 119 119]
f =
119 123 168 119
123 119 168 168
119 119 107 119
107 107 119 119
>> p=hist(f(:),8)
p =
3 8 2 0 0 0 0 3
>> [n,xout]=hist(f(:),8);
>> bar(xout,n)

>> c=huffman(hist(double(f2(:)),4))
c =
'011'
'1'
'010'
'00'
>> f=imread('.\08\Fig0809(a).tif');
>> c=mat2huff(f);
>> cr1=imratio(f,c)
cr1 =
1.0770
(zt)matlab调用C语言程序,MEX文件使用方法,matlab与C混合编程
matlab默认使用的程序文件格式是.m文件,在这些情况下需要调用外部的C语言程序主要包含以下几种情况:
1、在matlab环境中存在某些模块运行效率较低,在这种情况下改用C语言编写能够显著提升运行速度。
2、已有的高效算法均为纯C语言实现,在这种情况下希望能够在matlab环境下直接调用这些算法而不必将其完整转换为.m代码形式。
3、通过访问.m文件可以直接获取其源代码,在这种情况下为了保护知识产权作者希望仅提供接口和预编好的库函数供他人调用类似于Windows系统中的动态链接库(.dll)。
以上问题可以通过构建高效的Mex扩展来轻松解决。
那么什么是MEX文件呢?它其实是MATLAB语言与Executable程序的结合体。简而言之,MEX文件是什么?它其实是MATLAB语言与Executable程序的结合体。
注:以上改写遵循以下原则:
- 每句话仅做表达方式调整
- 保持段落结构完整
- 保留数学公式原样
- 增加了适当细节以提升可读性
- 使用相同的术语体系
在编写MEX文件之前需对Matlab编译器进行配置设置。具体步骤如下:首先检查当前安装的Matlab版本是否支持MEX文件生成;如果支持,则进入下一步骤。
以Matlab R2009a为例进行介绍,并说明其他版本的操作流程大同小异。
其中蓝色标记的是手动输入的内容块(即用户自定义的文字),而绿色显示的是Matlab默认提供的提示字符(如警告信息或帮助信息)。
在Matlab工作区中依次执行以下操作:首先运行mex -setup命令;随后根据系统提示选择已安装的编译器选项(建议选择'y'以确认)。
注意:如果未找到预期的编译器选项,请确保系统已正确安装所需开发环境工具包(如Lcc-win32 C compiler或Microsoft Visual Studio系列工具)。
通过以上步骤即可顺利完成编译器配置任务。
[0] None
Compiler: 1
此处我选择matlab自带编译器,所以我选择[1]."你也可以选择[2],使用VC6.0编译器",提示如下:
Please verify your choices:
Compiler: Lcc-win32 C 2.4.1
Location: F:\mat\sys\lcc
Are these correct [y]/n? y
matlab让确认所选编译器路径是否正确。“我的matlab安装在F盘,lcc路径正确,所以我选择y”,提示如下:
Trying to update options file: C:\Users\wei\AppData\Roaming\MathWorks\MATLAB\R2009a\mexopts.bat
From template: F:\mat\bin\win32\mexopts\lccopts.bat
Done . . .
至此编译器配置完成。
如何用MATLAB编写MEX源代码?
处理输入数据:
在进行输入数据处理时,请确保先通过Mex函数mxGetPr获取指向该数组的数据指针。随后使用Mex函数mxGetM和mxGetN分别获取行数和列数,并返回整数值。针对实型矩阵而言,则需先定义一个double类型的变量或指针变量M,并用于操作该类型矩阵的数据。
double *M;
int m,n;
//指针指向第一个参数的数据地址
M = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);
n = mxGetN(prhs[0]);
MATLAB矩阵数据的存储顺序是"从上到下,从左到右"的,这点和Fortran是一样的。也就是说对于MATLAB的m x n的矩阵A。 A(1,1) 就是 *M,A(2,1) 就是 *(M+1) ,以此类推,A(i,j) 就是 (M + m(j-1) + (i-1)).
注意: MATLAB的指标从1开始,C的指标从0开始。
操作输出数据:
对于输出数据,需要首先用专门的mex函数分配内存空间,如:
plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL); //生成m x n 的实矩阵。
同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如
double *A;//注意,是一维指针,对指针A赋值,就是给返回值赋值
A = mxGetPr(plhs[0]);
如何在MATLAB中编译C语言的MEX代码? 为了使编译链接C语言的MEX文件源程序,在MATLAB的命令窗口中执行mex test.c 这一命令将在当前工作目录下生成命名为test.mexw32的MEX文件。
MEX文件如何使用?
运行:在MATLAB的控制窗口中输入
x=2;
y=test(x)
输出:y=4
test.c源代码如下:
#include
#include "mex.h"
定义一个名称为_mexFunction的函数体(用于Mex运算),其输入参数包括nlhs(输入数量)、plhs(输出矩阵数组)以及nrhs和prhs(常量矩阵)。
{
double *p_out;
double input_data;
input_data=mxGetPr(prhs[0])[0];
plhs[0]=mxCreateDoubleMatrix(1,1, mxREAL);
p_out=mxGetPr(plhs[0]);
p_out[0]=2*input_data;
return;
}
