MATCOM与VC_混合编程中自定义函数作为输入参数的调用方法

合集下载

MATLAB与VC++混合编程的研究及应用

MATLAB与VC++混合编程的研究及应用

MATLAB与VC++混合编程的研究及应用摘要:介绍了三种实用易行的matlab与vc++混合编程方式,即利用matlab的mcc编译器,使用matcom软件转化m文件,使用matlab的com builder工具制作com组件。

针对具体程序分别应用三种方法来实现,对每种方法介绍了详细步骤。

对三种方法进行了分析比较,总结了各自的优缺点,实现了matlab出色的图形处理功能和数值计算能力与vc++强大编程能力的结合。

关键词:matlab;vc++;混合编程中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)10-2353-03matlab是适合多学科,多种工作平台的功能强大的大型数值计算和系统分析软件。

matlab将数值分析、矩阵计算、信号处理和图形显示相结合,包含了大量高度集成的函数,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具,在数值分析、科学计算、算法开发、建模和仿真等方面具有独特优势[1]。

但是matlab使用的是解释性语言,限制了自身的执行速度;程序的执行限制与matlab自身的运行环境,不利于应用程序的开发;gui功能较差。

vc++是强大的windows应用程序开发工具,它提供了高度集成的工具集和可视化集成的编程环境,包括了microsoft的代码优化技术,极大提高了应用程序的设计效率,还提供了复杂的资源编辑器,拥有强大的gui功能[2]。

因此,实现matlab与vc++等可视化程序设计语言的混合编程,提高程序的执行速度,美化应用程序界面,脱离matlab环境,发布独立的应用程序,同时利用matlab在数值分析、矩阵计算、信号处理和图形显示等方面的强大功能,具有重要的意义。

1 matlab与vc++混合编程方法matlab与vc++有多种接口方法,但是一些常见方法难以实现,执行效率低,如matlab engine、直接调用matlab的c/c++数学函数库等。

c++常用的调用方法

c++常用的调用方法

c++常用的调用方法在C++中,有许多常用的调用方法可以用来创建和调用函数。

下面列举了一些常见的调用方法:1. 函数调用:C++中最常见的调用方法就是直接调用函数。

函数调用的语法是函数名后面跟上一对括号,括号中可以传入函数的参数。

例如,如果有一个名为'printHello()'的函数,可以使用'printHello();'来调用该函数。

2. 函数指针调用:C++中还可以使用函数指针来调用函数。

函数指针是一个指向函数的指针变量,可以通过将函数名赋值给函数指针来创建。

然后,可以使用函数指针来调用函数,通过在函数指针后面加上一对括号并传入参数来调用函数。

例如,如果有一个函数指针'void (*functionPtr)();',可以使用'functionPtr();'来调用函数。

3. 成员函数调用:在C++中,类中的成员函数可以通过类的对象来调用。

使用成员函数调用的语法是通过对象名后面加上'->'操作符来调用函数。

例如,如果有一个名为'obj'的类对象,并且类中有一个成员函数'void printMessage()',可以使用'obj->printMessage();'来调用函数。

4. 函数对象调用:C++中的函数对象是一个类对象,可以像调用函数一样调用它。

函数对象可以重载圆括号运算符'()',使其具有函数调用的功能。

例如,如果有一个名为'funcObj'的函数对象,可以使用'funcObj();'来调用该函数对象。

5. Lambda表达式调用:C++11引入了Lambda表达式,它可以用来创建匿名函数。

Lambda表达式可以像函数一样调用,只需使用一对括号并传入参数即可。

例如,可以使用'[]() { cout << 'Hello, World!'; }();'来调用一个简单的Lambda 表达式。

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现摘要:文章探讨了MATLAB与VC++的优缺点,介绍了VC++与Matlab混合编程的几种方法。

通过二者的结合,既有效地利用了MATLAB强大的数值计算能力和众多的函数,大大减少程序设计的工作量,又继承了VC++良好的程序界面,证明是一种很好的程序设计方法。

具体说明了如何应用Matlab引擎实现混合编程以及如何利用MATCOM进行MATLAB和VC++混合编程,并将两种方法用于数字图像处理。

关键词:MATLAB;VC++;MATCOM;引擎;混合编程;图像处理一、引言1、数字图像处理简介:图像技术由高到低分为三个层次:图像处理、图像分析和图像理解。

图像处理是比较底层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。

数字图像处理最基本的目的就是改善图像,主要是按需要进行适当的变换突出某些有用的信息,去除或消弱无用的信息,如改变图像的对比度,去除噪声或强调边缘的处理等,其基本方法有:直方图修正、灰度变换、图像的频域特性、图像平滑、图像锐化等。

直方图是图像的重要统计特征,是表示数字图像中每一灰度级与该灰度级出现的频率数间的统计关系。

直方图能给出该图像的大致描述,如灰度范围、灰度级的分布、整幅图像的平均亮度等,但它不能完整地描述一幅图像。

通常用横坐标表示灰度级,纵坐标表示频数。

通常一幅均匀量化的自然图像由于其灰度直方图分布集中在较窄的低值灰度区间,引起图像的细节看不清楚,为使图像变得清晰,我们可以通过变换使图像的灰度范围拉开或使灰度分布在动态范围内趋于均匀化,从而增加反差,使图像的细节清晰,达到图像增强的目的。

灰度变换是图像增强的一种重要手段,它可以使图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。

灰度变换可分为线性、分段线性、非线性以及其他的灰度变换。

线性灰度变换实际上使曝光不充分的图像中黑的部分更黑,白的部分更白,从而提高对比度。

图像中的边缘或者线条部分与图像频谱中的高频成分相对应,因此采用高通滤波的方法让高频分量顺利通过,使低频分量受到抑制,就可以增强高频的成分,使图像的边缘或者线条变得清晰,实现图像的锐化。

基于MATCOM的VC++与MATLAB混合编程

基于MATCOM的VC++与MATLAB混合编程
件。VC +是 Mirsf 推 出的可视化 编程环 境 , + coot 几乎包
2 VC+ +与 Malb混合 编 程 方 法 [ [ t a 15 ]]
目前在 VC +环 境 中调用 Malb程序常 用以下几 + ta 种方 法 :
括了 Wi d ws 用的各 种方面 , no 应 一直是 Wi d ws 境 no 环 下最主 要的应 用开发 系统 , 目前综合性 最高 、最 强大 是 和最复 杂的软件 开发 工具 。但在 工程计 算方面 , 编程 就
开发软件 , 但是它们各有 优缺点 。Malb的突 出特点是 t a 简洁 , 它利 用丰 富的 函数资 源 , 给用 户带来 最直 观 、最
各种 应用程 序 中 , 并且 通过高级 语言 的编译器 编译为 二 进制 代码 , 大大 提高 代码 的执 行速 度及安 全保 密性 , 可 以发 挥各 自的优势 , 大大 缩短 软件 开发 周期 , 提高 了软
2 1 用 Malb引 擎 , 用 客 户 机 / 务 器 . t a 采 服 ( in/ev r的计算 模式 Cl t re ) e S
在 VC 中设 计程 序框 架 。作为前 端客户 机 , 通过调 用 Malb引擎与 后台 Ma lb服务器建 立连接 , t a t a 实现命 令 和 数 据 信 息 的 传 递 。 这 种 方 式 它 可 以 充 分 利 用
Ke wo d : M alb VC++ M ac m y rs ta ; : to
Hale Waihona Puke 1 引 言 Malb 和 VC +是 目前应用最广泛 的工 程仿真和 t a +
程 , 一种 有效 的编 程方 式 , 将给 应用 程序本 身及 其 是 这 开发带 来很好 的改善 。通 过把 Mal b的强大功 能融人 ta

MATLAB与VC++混合编程实现一维小波多尺度分解

MATLAB与VC++混合编程实现一维小波多尺度分解

引言小波分析世纪80年代开始发展成熟起来的一个数学分支,其应用领域十分广泛,并逐步成为信号分析的又一有力工具。

MATLAB的小波工具箱为我们提供了小波多尺度分解函数,方便了我们对小波的使用。

但是用它所编写的软件不能脱离MATLAB编程环境在W indows平台下直接运行,代码执行效率低下,运行时占较多的系统资源,不能达到某些用户的需求。

VC++是由美国Microsoft 公司开发的可视化C/C++集成编程环境,是目前功能最强大的软件开发工具之一。

被广泛应用于Win32平台的基础应用程序的开发。

它具有强大的图形界面编程能力且代码执行效率高,可生成脱离VC++环境而独立运行的应用程序。

可是VC++在数值处理分析和算法工具等方面不如MATLAB。

本文结合VC++和MATLAB 的各自优点,以VC++图形界面作为前台框架,MAT LAB作为后台进行数值运算和数据可视化,利用组件对象模型(COM)技术作为媒介,实现了一维小波多尺度分解。

1、一维小波多尺度分解原理及其MATLAB实现1.1 一维小波多尺度分解原理以此类推,直到指定级数的多尺度小波分解为止,分解过程如图1示。

图中s为原始信号,cd1,ca1分别为分解后第1层的细节序列和近似序列,cd2,ca2分别为分解后第2层的细节序列和近似序列,以此类推。

因为这种算法分解的数据结构是塔式结构,所以这种算法也常被称为塔式算法(Pyramid Algorithm)。

1.2 一维小波多尺度分解及重构的MATLAB实现MATLAB 小波工具箱提供了以下几个实现一维小波分解和重构的函数[3]:[C,L] = WAVEDEC(X,N,’wname’),多尺度一维小波分解函数。

其中C为分解结构变量,L为个分解结构以及原始信号长度变量,X为原始信号,N为分解层度,’wna me’为小波类型。

X = WAVEREC(C,L,’wname’),多尺度一维小波重构函数。

其中C,L为多尺度一维小波分解函数WAVEDEC的计算结果。

基于VC++和Matcom混合编程的函数最佳拟合的确定

基于VC++和Matcom混合编程的函数最佳拟合的确定

( ol e fnoma o n i e n ,C ptl r aUn e i , e i 0 0 7 C i ) C l g fr t n gn r g ai m l i r t B in 10 3 , h a e oI i E ei aNo v sy jg n
A src:Whnft gt e et aanpoet,latq ae to f na o t dte ler oy o a io e sda e b tat e tn t sdt jc essur h d s t pe a g ba ln mils f nue sh i i oh t i r s me io e d d n h a p t t
0 引 言
在 实 际 的 实验 、 程 和 测 量 中会 产 生 大 量 的 数 据 , 们通 工 人
常 用 数 据 拟 合 的方 法 来 求 得 自变 量 和 因变 量 之 间 的近 似 的 函
的集 成 开 发 环 境 。Maa 有 强 大 的 数 值 运 算 能 力 ,便 于 实 tb具 l 现 比 较 复 杂 的算 法 ; c + 目前 最 好 的 开 发 工 具 之 一 , 率 V +是 效 高 、 植 性 好 。 两 者 各 有 所 长 , 两 者 结 合 起 来 , 现 优 势 互 移 将 实 补 , 于实现工程 系统的快速设计 与开发 。 便
基于 V + 和 Ma o C+ t m混合编程的函数最佳拟合的确定 c
李 宝方 , 关 永 , 沈孝 本 , 赵 Байду номын сангаас 生
( 都 师范 大学 信 息 工程 学 院 ,北 京 10 3) 首 00 7
摘 要: 工程 中对得到 的实验数据 进行 拟合 , 常采 用最 小二 乘法 , 拟合 函数 多采用代 数多 项式 。但 当多项式次数 比较 大时 ,

VC++与MATLAB混合编程COM组件法

VC++与MATLAB混合编程COM组件法

COM 是component object module 的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。

matlab6.5 新推出来的combuilder 就是把用matlab 编写的程序做成com 组件,供其他语言调用。

该方法实现简单,通用性强,而且几乎可以使用Matlab 的任何函数(注意:不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab 公司(Matlab 公司就是Mathworks公司)推荐的使用方法。

COM(Compponent ObjectModel 组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab 下做COM 组件,以及如何在VC 中调用COM 组件。

首先在Matlab 编辑器里编辑m 函数文件:启动matlab->File->New->M-file 函数内容如图1:该函数无输入输出参数,文件保存为huatu.m。

function huatu()x=-10:0.1:10;y=sin(x);plot(x,y);在matlab 下建立COM 组件,步骤如下:1、在matlab command window 输入如下命令:>> deploytool出现以下界面:2、新建工程:File->New Deployment Project;弹出选择对话框如下图3、左侧选择Matlab Builder NE,右侧选择Generic COM Component;4、Name中输入工程名(比如hello4.prj);单击OK;出现下面界面5、右击hello4选择rename class可以改为合适的类名(比如huatu,这里没改);6、右击hello4class选择add file添加huatu.m文件(必须是函数文件);添加后如下图7、点击Tools->Build。

vs2013vc自定义函数的解释说明

vs2013vc自定义函数的解释说明

vs2013vc自定义函数的解释说明
VS2013VC是指Visual Studio 2013中的Visual C++开发环境。

在该环境中,你可以创建自定义函数来实现你所需要的功能。

自定义函数是一种有特定功能的代码块,可以接受输入参数并返回一个值。

它可以帮助你在程序中组织重复的代码、提高代码的复用性和可读性。

在VS2013VC中创建自定义函数的步骤如下:
1. 打开Visual Studio 2013,选择新建项目。

2. 选择Visual C++,然后选择你所需要的项目类型(如控制台应用程序、Windows桌面应用程序等),填写项目名称和保存路径,点击确定。

3. 在生成的项目文件中,找到源文件,一般是以.cpp为扩展名的文件,双击打开。

4. 在源文件中,找到你希望添加自定义函数的位置,可以在函数之外定义自己的函数,也可以在主函数之前或之后。

5. 写下函数的定义,包括函数的返回类型、函数名、参数列表和函数体。

例如:
```
int Add(int a, int b)
{
return a + b;
}
```
6. 在需要调用该函数的地方,使用函数名和参数列表来调用该函数。

例如:
```
int result = Add(5, 3);
```
以上就是使用VS2013VC创建和使用自定义函数的基本步骤。

你可以根据实际需求自定义更多的函数来实现不同的功能。

记得在编写自定义函数时考虑参数类型和返回值类型的匹配关系,以及在函数内部实现所需的业务逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件开发与设计SOFTWARE DEVELOPMENT AND DESIGN1引言VC++是Windows平台下流行的可视化应用程序开发环境之一,它为软件开发人员提供了完整的编辑、编译和调试工具以及建立在Win32API基础上的MFC类库,可以有效缩短Windows应用程序的开发周期。

用VC++开发出的程序具有容易维护、界面友好、执行速度快等优点。

用VC++开发工程技术方面的程序时,当涉及矩阵运算或数据可视化,工程技术人员不得不编写大量繁琐的代码。

因此,Matlab与VC++混合编程可以把Matlab在数值计算、算法设计以及数据可视化等领域的优势与VC++有机集成到一起,可以提高程序处理的效率和稳定性,同时也大大减少编写算法代码的工作量,提高工作效率。

有关两者混合编程问题的讨论,很多篇文献有所涉及[1-5],大多都提到了VC++怎样调用Matlab工具箱里的函数,但所采用的例子一般都是简单的函数或脚本[2][4-5]。

对于工程技术研究来说,有一些很重要的函数要求函数作为输入参数,例如:极值及极值点计算、非线性拟合等函数,这类函数使用自定义的函数作为输入参数,在VC++与Matlab的混合编程环境中对此类函数调用时,很难正确编译,很少有文献介绍这方面的知识,网络上也有很多工程技术人员请教此类问题的帖子。

2常用方法在解决VC++如何调用Matlab工具箱中要求以自定义函数作为参数的函数之前,先简单介绍一下两者混合编程的常用方法[1-3][5]。

2.1Matlab CompilerMatlab Compiler是Matlab自带的编译器,可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、独立可执行应用程序等。

Matlab Compiler将m文件转换成独立应用程序过程中生成的C/C++文件,原则上可以被其他C/C++代码调用。

但是这种方法不能处理嵌套调用其他m文件的m文件,不支持Matlab对象,不能编译Matlab的一些内联函数,并且转换代码的可读性较差。

2.2Matlab combuilderCOM是Component Object Module的简称,是一种通用对象接口,任何语言只要按照这种接口标准,就可以实现调用。

Matlab的combuilder把Matlab编写的程序做成com组件,供其他语言调用。

该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数,因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab发行商推荐的使用方法。

2.3通过Matlab Engine方式Matlab Engine采用客户机/服务器模式,C/C++程序作为前台客户机,Matlab作为计算引擎,利用engine实现Matlab的强大功能,引擎程序和C++程序各自作为一个进程单独运行,MATCOM与VC++混合编程中自定义函数作为输入参数的调用方法谷社峰,崔瑞华(大庆油田有限责任公司勘探开发研究院,大庆163712)摘要:介绍了Matlab和Visual C++混合编程的几种常用方法及怎样设置Visual MATCOM编译环境,重点讨论了Matlab工具箱中某些以自定义函数作为输入参数的函数在VC++中无法编译的问题。

在Visual MATCOM编程环境下,借助MATCOM内置函数库,实现了VC++对此类函数的直接调用。

关键词:Visual MATCOM;VC++;函数;输入参数;混合编程The Method of Calling the User-defined Function as the Input Argument in Mixed Programming with MATCOM and VC++GU Shefeng,CUI Ruihua(Research Institute of Exploration and Development,Daqing Oilfield Co.Ltd.,Daqing163712)Abstract:The several conventional methods concerning mixed programming with MATCOM and VC++and how to completethe Visual MATCOM installation with the VC++Developer Studio environment are simply introduced.It is discussed thatsome functions in Matlab toolboxs required the user-defined function as its one input argument can’t be compiled by VC++compiler correctly.The method of Calling the user-defined function as the input argument is presented by mean of the MAT-COM’s built-in function libraryKey words:Visual MATCOM;VC++;Function;Input argument;Mixed programming本文收稿日期:2009-9-2621--电脑编程技巧与维护通过进程间的通信机制进行交互。

这种方法,需要在机器上安装Matlab软件,而且程序执行效率低。

2.4直接调用Matlab C/C++Math Library数学函数库Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,在VC++中可以直接使用这些函数。

但使用这种方法调用Matlab的工具箱函数有很大困难,适合对C\C++语言比较熟悉的用户使用,且不支持Matlab中丰富的图形句柄处理函数。

2.5使用MATCOM工具MATCOM是MathTools公司开发的一个基于C++矩阵函数库Matrix的转换Matlab的m文件到CPP文件的程序,它可将Matlab的源代码翻译成同等功能的C++源代码,既保持了Matlab的优良算法,又保持了C++的执行效率高的优势。

MATCOM软件平台本身的功能相当强大,提供近千个Matlab 的基本功能函数,通过必要的设置,就可以直接实现与C++的混合编程,而不必再依赖Matlab。

同时,MATCOM还能够将Matlab函数或编写的Matlab程序转换为C++形式的DLL,它与VC++有良好的接口,只要包含必要的库文件和头文件即可实现对Matlab函数的调用,而无需运行Matlab,速度明显提高。

MATCOM转换过程简单,不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件,可以方便地生成动态链接库文件和可执行文件,它还支持一定的图形显示,生成代码的可读性好。

MATCOM方法简单快捷,尤其值得一提的是,MATCOM 可以通过插件的形式有机地嵌入VC++开发环境(即Visual MATCOM),实现可视化编程,利用Visual MATCOM插入m 文件到VC++工程中可自动实现所需库文件、头文件、CPP文件的连接及编译环境的设置,如果出现编译错误,直接修改m文件即可。

对工程技术中那些要求以自定义函数作为输入参数的函数的调用,一般的方法很难实现,比如Matlab中的非线性拟合函数lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options),其中参数“fun”为自定义的待拟合函数,在VC++中无法直接调用。

但Matlab中很多函数在MATCOM函数库中都有对应的函数,它们直接用C/C++编写,可以和VC++实现无缝接口。

MATCOM 中的curvefit(‘f’,x0,x1,y1,options,‘g’)函数完成Matlab中lsqcurvefit()相同的功能,在Visual MATCOM编程环境中直接调用即可。

Visual MATCOM实现m文件的一键插入,所需的其他嵌套m文件及库文件、头文件、CPP文件也同时自动添加到当前VC++工程中。

但实际中,诸如此类需要自定义函数作输入参数的函数,在VC++中正确实现自定义函数的传递也并非易事,涉及到函数注册等繁琐的过程。

实践中摸索出Visual MATCOM编程环境中调用的此类函数的简洁方法。

3Visual MATCOM编程环境的安装及设置以MATCOM4.5、中文版VC++6.0和Windows XP操作系统为例。

(1)安装MATCOM4.5(安装过程参见MATCOM安装指南)。

(2)拷贝<MATCOM45>\bin\usertype.dat文件到<visual c++6.0>\Common\MSDev98\Bin目录下(<MATCOM45>、<visual c++6.0>分别指MATCOM4.5和VC++6.0的安装路径)。

(3)运行Visual C++6.0,从菜单条中选择“工具/定制/附加项和宏文件”,选择“浏览”,改变文件类型为Add-ins(. dll),选定<MATCOM45>\bin\mvcide.dll文件,确信Visual MATCOM Add-in被选定,点击“关闭”。

(4)一个包含四个按钮的新工具栏出现在Visual C++界面上(参见图1),表明Visual MATCOM安装成功[10]。

4自定义双指数函数拟合实例对一系列观测数据实现双指数函数拟合,双指数函数的表达式为:F=a*(exp(-b*x)-exp(-c*x)),其中a、b、c为系数,调用MATCOM4.5中curvefit()函数来获取双指数函数的系数。

(1)在文本编辑器编写自定义待拟合函数的m文件my-fun.m:function f=myfun(c,t)f=c(1)*(exp(-1*c(2)*t)-exp(-1*c(3)*t));(2)编写调用MATCOM函数库中内置非线性拟合函数curvefit()的m文件callcurvefit.m:c=[5.4,0.08,0.35];%自定义双指数函数系数赋值t=linspace(0,40,25);f=c(1)*(exp(-c(2)*t)-exp(-c(3)*t));ydata=f+0.4*f.*rand(1,length(f));%产生添加噪声的待拟合数据xdata=t;x0=[1;1;1];%迭代初始值%#call myfun;%调用自定义双指数函数myfunoptions(14)=10000000;%最高迭代次数%options为控制拟合精度的一维矢量x=curvefit('myfun',x0,xdata,ydata,options);%调用MATCOM内置拟合函数curvefit()%x为返回的双指数函数的系数plot(xdata,ydata,'bo');title('双指数函数拟合');x1=linspace(min(xdata),max(xdata),1000);y1=x(1)*(exp(-1*x(2)*x1)-exp(-1*x(3) *x1));hold on;plot(x1,y1,'r-');legend('原始数据点','matcom curvefit()拟合曲线');(3)新建VC++“Win32Console Application”(以控制台应用程序为例),工程名gbzcurvefit,把上面创建的两个m文件拷贝到VC++当前工程目录下,按Visual MATCOM工具栏第一个或第二个按钮,选callcurvefit.m文件,按确定按钮后,则被调用的自定义函数myfun.m文件、其它嵌套调用的m文件对应的头文件、CPP文件、所需的库文件自动插入到时当前工程中,如图1所示。

相关文档
最新文档