搜档网
当前位置:搜档网 › 利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 _ Capbone

利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 _ Capbone

利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 _ Capbone
利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 _ Capbone

Select a page

Viewpoints

LEGO

Tech

Internet

Mobile

Archives

Misc.

About

Blogroll

RSS

Donate!

Viewpoints

LEGO

Tech

Internet

Mobile

Archives

Misc.

About

Blogroll

RSS

Donate!

利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程

这篇文章要说的当然不是如何用 PS、LightRoom 来处理 Raw 文件,而是一种更加彻底、数据化的办法 -- 利用 Matlab 直接处理数码相机的 CFA(Color Filter Array) 数据。

接触过摄影的人都知道,对于数码相机来说 Raw Data 是原始的、未被处理的数据,相比 JPEG,

Raw 文件记录了更多的场景信息,保留了更宽广的色域以及动态范围,也留下了更为自由的后期处理空间。Raw Data 只是一种图像数据的封装形式而并不是一种文件格式,不同厂商的相机一般都拥有自己的 Raw Data 格式,比如常见的 *.CR2、*.NEF、*.ARW、*.ORF(Olympus)、

*.RAF(Fuji)、*.DNG(Adobe、Leica)等。

对于大部分人来说,处理 Raw Data 的软件不外乎就那么几种,Camera Raw、LightRoom、Aperture、DxO 以及各厂商自带的处理软件。这些软件虽然通过图形界面提供了简洁易懂的处理流程,但是遗憾的是它们能导出的都并非真正意义上的 “Raw Data”,即传感器直接记录的、与照度成线性关系的第一手数据。对于摄影、媒体、艺术领域,这些软件已经足够强大,但是在图像处理、计算机视觉等研究领域,我们需要的是把照片中的信息转换为能够通过数字来定量表示的形式,或者通过一些公式、算法直接对图像(或图像的某一部分)进行处理,再或者对两张图片之间的差别进行量化表示,这时候 LightRoom 这些软件就显得有些无能为力了。这篇文章要讲的就是如何通过 Matlab 对 Raw Data 进行处理并从中提取出我们想要的图像信息,这是一种我所了解的最彻底、最根本的获取相机传感器原始信息的方法,并且这些信息都是以数字的形式记录下来,可以很方便地在此基础上进行图像的存储、传输或者进一步操作。实际上 Matlab 本身就提供了非常强大的图像处理功能,正所谓 “普通青年处理图片用 PS,文艺青年处理图片用 LightRoom,2B 青年处理图片用 Matlab”。

由于各家相机厂商对 Raw Data 采取了不同的封装方式,Matlab 并不能一一识别这些文件格式,因此我们需要先利用 Dcraw 将不同扩展名的文件转换为 Matlab 能够读取的图片格式 -- tiff。Dcraw 是一种 Raw Data 解析方案,它能够识别市面上大部分的相机型号,并将相应的 Raw 文件导出为 tiff 或PGM/PPM/PAM 格式文件。事实上 Dcraw 本身就可以算作一种 Raw Data 的处理程序,它拥有白平衡设置、伽马校正、色彩空间转换、去马赛克、亮度调节等一系列功能,并且提供了 C 源代码,让用户可以在任何操作系统上对其进行编译。关于 Dcraw 更详细的设置可以在其官方文档或这个博客中查看,这里我们仅仅把它作为 Raw Data 到 tiff 的一种媒介,而不对图像做任何的处理 -- 把所有的操作都留到 Matlab 里。

0. Dcraw 的预处理

以下操作以 Windows 平台为例,使用的相机为 Nikon D3X。

为了简化流程,我们使用 Dcraw 现成的可执行文件

(https://https://www.sodocs.net/doc/f45096623.html,/~dcoffin/dcraw/dcraw.exe)而不在本地对其编译。一般将这个Dcraw.exe 文件放在 C:windows 路径下,这样可以直接从运行(Win + R)中执行。在运行中输入cmd 进入命令行窗口,这时已经可以直接调用 Dcraw,或者输入 dcraw 查看相关的一些命令。

由于我们不准备用 Dcraw 对 Raw Data 做任何处理,只需要输入

dcraw -4 -T -D -v pathfilename

其中 pathfilename 为图像的绝对路径,比如 E:\photosimg1.NEF 这样。

这里的 -T 表示将图像以 tiff 格式导出,-D 表示不对图像做任何的彩色插值和亮度调节(彩色插值的问题后面会提到),-v 表示在 Dcraw 处理结束后在屏幕上显示相关信息(这一步有没有都无所谓),而 -4 等价于 -6 -W -g 1 1,即表示导出的图像为16位(而不是常见的 JPEG 的8位 )、不进行任何白平衡校正、不进行任何伽马校正。在一些需要获取拍照时白平衡设置的场合也可以使用 -6 -w -g 1 1 -T -D 这样的参数组合,但这里我们使用 -4 -T -D 就好。各参数的意义在上面提到的官方文档

页面中有详细的说明。

完成这一步之后在原 Raw 文件同一个文件夹下就会多出了一幅 tiff 格式的图像,这时候大部分图片浏览软件都可以打开它了(一些看图软件在安装插件后能够直接浏览 Raw 文件,比如我的IrfanView,但实际上它们打开的只是嵌入在 Raw Data 中的经过一系列转码的缩略图而并非 Raw 本身)。但是为了避免各种图像浏览软件不同的解码方式对预览图像造成的影响,下面都使用 Matlab 中的 imshow 函数来浏览图像。

同样是这幅 tiff 图片,如果直接使用 IrfanView 查看,得到的是下面的效果,明显比 Matlab 中的要亮得多。

下面的图片截图如果不特殊说明都是指在 Matlab 中预览的效果。

得到的这幅 tiff 图像除了一些缩略图和文件头之外,基本上记录了与 Raw Data 同样多的图像信息,并且是 Matlab 可读取的。由于编码上的差异,并且 Dcraw 不像大多数软件那样去除了图像边缘的一些像素,有时这个 tiff 文件的体积甚至会比 Raw Data 文件更大。

与 Camera Raw、LightRoom 等软件打开的 Raw 文件最明显的区别就是,这张 tiff 图片是黑白的。这里牵涉到了去马赛克(Demosaic,但我更喜欢叫它彩色插值)的问题,下面我简单地谈谈我的理解,不一定完全正确。详细的介绍还是看 Wiki 吧。

大家都知道一般民用的数码相机只有一块 CMOS 或 CCD(这里不谈 3CCD 或 Foveon X3),而无论是 CMOS 还是 CCD,都只对照射在它们有效面积之上的光通量敏感,并且产生与该光通量成正比的电流作为输出。这个输出实际上是由光源的光谱功率分布(SPD)、物体表面反射比以及相机传感器灵敏度共同作用的关于波长的一个积分结果。由于这是一个对整个可见光波段的关于波长的积分,显

然不能够表示任何色彩信息。正因为这一点,目前消费级相机的传感器都是不具备任何颜色感知能力的,照片中所有色彩的信息实际上都是软件处理后的结果。正因为这点,我们一般不可能得到一张真正“未经处理过”的图片。

既然传感器只能感受光的“强度”而非“色彩”,我们就需要在传感器之前放置一些特定波长的滤光片,使得经过这些滤光片后作用在传感器上的光信号只是单一波长的乘积形式(比如550nm),而非整个可见光波段(380nm ~ 780nm)的积分形式。实现这个功能最常见的滤光片就是拜耳滤镜,如下图所示。

灰色部分为 CMOS,彩色部分为对应颜色的滤镜,每个滤镜下方对应的像素点只能接收到该滤镜对应波长的光信号,而不是整个可见光谱范围的光信号。根据左上角四个滤镜从左至右、从上至下的顺序一般有“RGGB”、“GBRG”、“GRBG”几种。D3x 为“RGGB”型,具体相机的滤镜排列可以对着红绿蓝单色图片分别拍摄一张然后查看 Raw Data 的数值分布来获得。知道自己相机所用的拜耳滤镜的排列模式(Pattern)是进行彩色插值操作的前提(之所以绿色滤波片的数量是红蓝滤波片数量的两倍,主要是因为人眼对绿光最为敏感,这点不作展开说明)。既然知道了每个颜色滤波片背后CMOS 对于像素单元上的光强度,以及各个像素之上的滤波片颜色,我们就可以对每个像素的三原色进行恢复,这就是去马赛克(Demosaic)或者说色彩插值的本质。举个例子,假设某个 CMOS 阵

列上的滤波片为“RGGB”排列(参考上图),现已知某个像素点 x 对于为 R 滤波片,则其上、下、左、右四个像素点必定对于 G 滤波片,右上、左上、右下、左下四个像素点必定对于 B 滤波片,因此这时候像素点 x 对应的 R 通道数值就是该点 CMOS 上实际的电流大小;而 G 通道数值是对上、下、左、右四个像素 CMOS 电流大小取平均之后的值;同理,B 通道是对右上、左上、右下、左下四个像素取平均之后的值。当然这里说的只是最简单的插值方法 -- 领域取平均法,实际上各个厂商都需要考虑各方面因素对色彩插值进行算法上的优化。

一般我们看到的 JPEG 图像或者彩色的所谓的 Raw Data,都必定经过这一步色彩插值。但是我们现在希望把这一步骤留到 Matlab 中进行,所以在 Dcraw 中选用 -D 参数使得插值先不被执行,这也是为什么上面得到的 tiff 图像仅仅是灰度图像 -- 因为它只记录了光强度信息,而不包含任何颜色信息。

这时可以在 Matlab 中打开这幅灰度图像了。由于各个像素上记录的光强度是一个标量,这幅图像相当于一个 m × n 的矩阵,其中 m 和 n 分别为 CMOS 纵向和横向的像素数。

raw = double(imread('img1.tiff'));

现在终于可以开始在 Matlab 中对相机传感器的原始数据进行处理了。

整个处理过程大概遵循以下步骤:

如果不是要对图像进行处理,而仅仅是希望获得拍照时场景照度的相关数据,只需要进行到第三部Demosaicing 即可。下面的步骤仅仅是在 Matlab 中模拟一张相片从被 CMOS 记录到最终呈现在屏幕上的整个过程,相当于人为地重新干了一遍数码相机中图像处理芯片干的事情。若是出于研究的需要,可以对任意一步修改或增加操作。例如需要研究 Gamma 曲线,就不应该在 Matlab 中执行我提供的 Gamma 校正()的函数,而应该根据需要使用合适的 Gamma 曲线。

1. 线性处理(Linearization)

出于节省数据存储空间的目的,一些厂商(例如尼康和索尼)的 Raw Data 并不完全与像素点上的照

度呈线性关系,而是会在编码上做一些处理,比如非线性压缩等。不过这里我们不需要担心这个问题,因为之前在 Dcraw 中使用 -4 参数时就已经解决了这个问题。我们只要确保各个像素的数值是分布在 14-bit (虽然 Dcraw 中的 -4 参数将图像设为16位,但其最大值仍然为 )能够

储存的范围之间即可,一般为 0 ~ 16383,并将超出这个区间的数值给拉回区间中。再将这些数值归一化至 0~1 区间中。

black = 0;

saturation = 16383;

lin_bayer = (raw-black)/(saturation-black); % 归一化至[0,1];

lin_bayer = max(0,min(lin_bayer,1)); % 确保没有大于1或小于0的数据;

要说明的是,我这里使用的 black = 0 以及 saturation = 16383 仅仅是针对 D3x 而言,不同厂家的相机,或者同一厂家不同型号的相机都可能不同。如果第一次使用某台相机不知道这两个参数,可以使用 dcraw -v -T 命令来查看,然后记下这两个数值供日后使用。要注意的是在命令行中每执行一次dcraw 的命令,所生成的 tiff 文件都会覆盖掉原来的 tiff 文件,因此建议将原始的 Raw 文件先复制到另外一个路径下在执行 dcraw -v -T 命令。下图中我使用的 Nikon D3x 和 SONY A7 就拥有完全不同的 black 和 saturation 值(索尼的 Raw 被压缩到了坑爹的12位...),因此在 Matlab 中处理 A7 的图片时我就需要将上面的代码改为 black = 128 以及 saturation = 4095。

线性处理到这里就完成了,在 Matlab 中用 imshow 来查看这一步我们得到的图像(灯箱背景出现的四道条纹是摩尔纹的缘故,无视就好):

2. 白平衡校正(White Balancing)

其实将这一步叫作白平衡校正也并不是很恰当,因为这并不是指利用各种白平衡算法对图片的色调进行修复的那个白平衡校正,而仅仅是对 RGB 三通道乘上不同的增益系数,以补偿因为三种滤波片具有不同光谱灵敏度带来的影响。如果不考虑图像亮度(亮度的处理我们放在后面),将 R 通道乘以2并保持 G 通道不变,或者将 G 通道乘以0.5并保持 R 通道不变,这两种方式对画面颜色变化的影响是等效的。因此我们通常将 G 通道的增益系数固定为1,仅仅考虑 R 和 B 的系数。关于这两个系数具体数值应该取多少,则取决于相机的型号以及拍摄时使用的白平衡参数。实际上,在相机的白平衡设置里选择不同场景,就是在调整这两个增益系数。如果想还原为拍摄时使用的白平衡设置,可以在Dcraw 中使用 -w -v 参数,这时屏幕上会显示出当时所使用的 R、B 通道的增益系数。

上图中的2.433594和1.347656分别表示拍摄这张图像时所使用的 R 通道和 B 通道的增益。要注意的是,一旦使用了 -w 参数,Dcraw 就会自动完成彩色插值的工作,这样得到的 tiff 图像就不再是原始灰度图像了。因此我们仅仅是使用 -w 来查看增益系数。如果不希望使用拍摄时的白平衡设置,则可以使用 -W 参数,这样不管当时用的是哪种白平衡档位,其 R、B 增益都是一个固定的值。例如对于这台 D3x 来说固定的 R、B 增益分别为2.625910和1.263930。在实际的图像处理应用中,通常需要固定相机的白平衡参数,即在相机的白平衡设置中手动输入色温。对于使用相同相机白平衡设置(Auto 除外)拍出的图片,它们都具有相同的增益系数。可以通过 -g 参数手动设置三通道的增益系数,例如 -g 1 1 1 1。

得到了 R、B 通道的增益后,我们需要将相应的像素值乘上这个系数。前面说过,不同相机具有不同的拜耳滤镜排列方式,因此需要根据实际情况进行增益系数的乘法。这里我使用的是相机拍摄时的白平衡参数,即 r_multiplier = 2.433594 和 b_multiplier = 1.347656。

wb_multipliers = [2.433594, 1, 1.347656]; % for particular condition, from dcraw;

mask = wbmask(size(lin_bayer,1),size(lin_bayer,2),wb_multipliers,'rggb');

balanced_bayer = lin_bayer .* mask;

上面代码中的 wbmask 函数就是根据实际拜耳滤镜的排列生成对应的掩板:

function colormask = wbmask(m,n,wbmults,align)

% COLORMASK = wbmask(M,N,WBMULTS,ALIGN)

% Makes a white-balance multiplicative mask for an image of size m-by-n

% with RGB while balance multipliers WBMULTS = [R_scale G_scale B_scale].

% ALIGN is string indicating Bayer arrangement: 'rggb','gbrg','grbg','bggr'

colormask = wbmults(2) * ones(m,n); % Initialize to all green values;

switch align

 case 'rggb'

colormask(1:2:end,1:2:end) = wbmults(1); % r

colormask(2:2:end,2:2:end) = wbmults(3); % b

 case 'bggr'

colormask(2:2:end,2:2:end) = wbmults(1); % r

colormask(1:2:end,1:2:end) = wbmults(3); % b

 case 'grbg'

colormask(1:2:end,2:2:end) = wbmults(1); % r

colormask(2:2:end,1:2:end) = wbmults(3); % b

 case 'gbrg'

colormask(2:2:end,1:2:end) = wbmults(1); % r

colormask(1:2:end,2:2:end) = wbmults(3); % b

 end

end

完成白平衡调整后的图像如下。由于 R 和 B 通道都乘以了大于1的数,图像的平均亮度较上一张略有提高了。

3. 色彩插值(又称去马赛克,Demosaicing)

上文提到的插值步骤在这一步中实现,经过色彩插值之后原来的灰度图像就成为了一幅三通道的彩色图像。空间插值有非常多的方法,这里为了方便我们使用 Matlab 内置的 Demosaic 函数,它能够直接把单通道的灰度图像转换为三通道的彩色图像。由于 Demosaic 函数的输入必须为 uint8 或 uint16类型,我们需要把原来的 double 型先转换为 uint16 型。注意这里的 'rggb' 应该根据相机的具体情况而调整。

temp = uint16(balanced_bayer/max(balanced_bayer(:)) * (2^16-1));

lin_rgb = double(demosaic(temp,'rggb'))/(2^16-1);

完成这一步之后我们就得到了最原始的彩色信息。一些应用中所需要的就是这幅图像的数据,可以使用 imwrite 函数将其保存在硬盘中。后续的色彩空间转换、Gamma 校正等步骤视情况决定是否需要执行。色彩插值后得到的图像如下:

4. 色彩空间转换(Color Space Conversion)

关于色彩空间这里不作过多介绍,举一个最简单的例子,同样一幅图像文件分别在两台显示器上显示,其各个像素的 RGB 值肯定是一样的,但是人眼看上去往往都存在细微的颜色偏差,这就是因为RGB 色彩空间是设备相关的(Devices-Dependent),而任何两台显示器的 RGB 色彩空间一般都不会完全相同。具体的解释参考 Wiki。为了使一幅图片在各种显示设备上有尽量一致的视觉效果,我们就需要一个设备无关(Devices-Independent)的色彩空间作为传递媒介。目前在电子设备中用的最多的设备无关的色彩空间(有时也称绝对色彩空间)就是 sRGB 和 AdobeRGB。

如果在 Dcraw 中使用了色彩插值,则自动包含了一个色彩空间变换的过程。Dcraw 先将相机相关的RGB 空间转换至 XYZ 空间,然后再从 XYZ 转换到 sRGB 作为输出。在 Matlab 中我们将这两个步骤合二为一。

下面我将与相机相关的 RGB 色彩空间称作 Camera。对于大部分相机,我们可以得到从 XYZ 空间到相机相关空间的变换关系,即已知 XYZ-to-Camera。而作为两种绝对色彩空间,sRGB-to-XYZ 也是固定的。根据矩阵运算法则,我们可以得到从相机相关空间到 sRGB 空间的变换关系:

不同相机的 Camera 不同,因此我们必须获得适合自己相机的 。在 Dcraw 官网提供的

c 文件中收集了市面上大多数相机的 ,可以在 dcraw.c 中的 adobe_coeff 函数下找到,

并且这个数据库是定期更新的。adobe_coeff 函数下的数字是 中各元素乘以10000后

逐行排列的数值,

或者也可以使用 Adobe DNG Converter 这个软件来查看相机的 。这种方法得到的数值

对应了矩阵中逐列排列的各元素。以 D3x 为例,有:

而 sRGB-to-XYZ 可以在国际照明委员会(CIE)公布的标准中查到,有:

得到了这两个矩阵,自然也就能够算出 。

在色彩空间转换过程中必须考虑这样一个问题:由于白色(客观意义上的白色)在相机的 RGB 空间和 sRGB 空间中都是用 来表示,而我们上述白平衡调整的目的就是要确保图像中白色的

部分在任何空间中都呈现出白色。因此以下关系必须成立:

根据线性代数的知识,要满足上式,矩阵 的每一行元素之和必须为1,因此在 Matlab

中我们必须再加上一个步骤,将 各行归一化为1。

色彩空间变换的代码如下。注意矩阵 XYZ2Cam 请根据自己使用的相机型号进行修改。sRGB2XYZ = [0.4124564 0.3575761 0.1804375;0.2126729 0.7151522 0.0721750;0.0193339 0.11919200.9503041];% sRGB2XYZ is an unchanged standard XYZ2Cam = [7171 -1986 -648;-8085 15555 2718;-2170 2512 7457]/10000;% Here XYZ2Cam is only for Nikon D3X, can be found in adobe_coeff in dcraw.c sRGB2Cam = XYZ2Cam * sRGB2XYZ;sRGB2Cam = sRGB2Cam./ repmat(sum(sRGB2Cam,2),1,3); % normalize each rows of sRGB2Cam to 1Cam2sRGB = (sRGB2Cam)^-1;lin_srgb = apply_cmatrix(lin_rgb, Cam2sRGB);lin_srgb = max(0,min(lin_srgb,1)); % Always keep image clipped b/w 0-1其中 apply_cmatrix 函数就是把我们得到的

应用到原图像的各个通道上:

function corrected = apply_cmatrix(im,cmatrix)% Applies CMATRIX to RGB input IM. Finds the appropriate weighting of the

% old color planes to form the new color planes, equivalent to but much

% more efficient than applying a matrix transformation to each pixel.

if size(im,3) ~=3

 error('Apply cmatrix to RGB image only.');

end

r = cmatrix(1,1) * im(:,:,1)+cmatrix(1,2) * im(:,:,2)+cmatrix(1,3) * im(:,:,3);

g = cmatrix(2,1) * im(:,:,1)+cmatrix(2,2) * im(:,:,2)+cmatrix(2,3) * im(:,:,3);

b = cmatrix(3,1) * im(:,:,1)+cmatrix(3,2) * im(:,:,2)+cmatrix(3,3) * im(:,:,3);

corrected = cat(3,r,g,b);

经过色彩空间变换后的图像如下,可以看出相比变换之前的图像,各个彩色色块饱和度明显增加,而白色色块颜色保持不变。

5. 亮度校正与伽马校正(Brightness and Gamma Correction)

对于大部分处于研究目的的图像处理流程,这一步不建议执行。在这一步之前,我们得到的图像仍然是与拍摄场景呈线性的,而线性数据往往才是对分析图像有帮助的。但是为了得到更好的显示效果,亮度与 Gamma 校正通常是必不可少的。如果对最后输出的图像存有异议,强烈建议首先返回到这一步中来寻找问题。

根据经验,一张图像的平均亮度是像素最大值的四分之一时我们认为它是亮度合适的(注意这条法则不适用于所有场景,例如一张夜景图像中平均亮度往往会很小)。因此我们调整全局亮度使其符合这一假设:

grayim = rgb2gray(lin_srgb); % Consider only gray channel

grayscale = 0.25/mean(grayim(:));

bright_srgb = min(1,lin_srgb * grayscale); % Always keep image value less than 1

接下来是 Gamma 校正。Gamma 曲线是图像、信号处理领域使用最为广泛的非线性处理,我们最容易见到的就是 Photoshop 中的“曲线”功能,如果将曲线拉成 的形状,就相当于对图像做了一

次 Gamma 校正。Gamma 校正是一个很大的话题,这里不具体介绍,可以参考 Wiki 。在 sRGB 的官方文档中使用的是 ,并在函数值较小的部分应用了小范围的线性函数。但是现在大多数平

台(Windows,Mac)都使用了 的曲线,因此这里我们也使用 2.2 作为参数,并且不考虑局

部的线性化。如果需要精确的 sRGB 标准的校正函数,可以查看其官方文档。

nl_srgb = bright_srgb.^(1/2.2);

经过亮度校正和 Gamma 校正后的图像如下。由于使用的 Gamma 曲线是一条凸函数,相当于把图像暗部的细节展宽,因此得到的图像要比校正前更亮。

到此为止一套通用的 Raw Data 处理流程就完成了,接下来可以根据需要再进行一系列的处理过程,比如使用一条 S 型曲线增加图像对比度、进行白平衡处理等等,或者直接保存为 tiff 文件再导入到其

他图片处理软件中进行处理。

下面换一张比较生活化的图片,再对整个流程做一个展示。

▲ Matlab 直接读取由 Dcraw 导出的 tiff 文件

▲ 线性处理后的图片

▲ 白平衡调整后的图片,这里使用 R、B 的增益系数分别为2.203125和1.378906

MATLAB文件各种操作方法(全)

1.1 文件的打开和关闭 1.1.1 文件的打开 fopen ('filename', 'mode') mode格式有: ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。 ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。 ‘a’:在打开的文件末端添加数据。文件不存在则创建。 ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 如果rt表示该文件以文本方式打开,如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 Fopen函数两个返回值: 1、一个是返回一个文件标识(file Identifier),它会作为参数被传入其他对文件进 行读写操作的命令,通常是一个非负的整数,可用此标识来对此文件进行各种处理。 (如果返回的文件标识是–1,则代表fopen无法打开文件,其原因可能是文件不 存在,或是用户无法打开此文件权限); 2、另一个返回值就是message,用于返回无法打开文件的原因; 例:1-1 [f,message]=fopen('fileexam1', 'r') if f==-1 disp(message); %显示错误信息 end (若文件fileexam1不存在,则显示如下信息。 Cannot open file.existence?permissions?memory?) 例:1-2 [f,message]=fopen('fileexam2', 'r'); if f==-1 disp (message); %显示错误信息 else disp(f); end 若文件fileexam2存在,则返回f值。 1.1.2文件的关闭 Fclose(f) F为打开文件的标志,若若fclose函数返回值为0,则表示成功关闭f标志的文件;若返回值为–1,则表示无法成功关闭该文件。(打开和关闭文件比较耗时,最好不要在循环体内使用文件) 若要一次关闭打开的所有文件,可以使用下面的命令:fclose all

MATLAB操作txt总结

使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原作者略去,在此对所有原作者表示感谢! 特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。 一. 基本知识: --------------------------------------------------这是转载内容 ---------------------------------------------------- 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte) 组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种: ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASCII码:00110101 00110110 00110111 00111000 ↓↓↓↓十进制码: 5 6 7 8 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS 命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为: 00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文

matlab文件操作及读txt文件(fopen,fseek,fread,fclose

matlab文件操作及读txt文件(fopen,fseek,fread,fclose) matlab文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:λ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。λ λ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。λ λ‘a’:在打开的文件末端添加数据。文件不存在则创建。 λ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。

2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose 函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件 fid =3 %其值大于0,表示打开成功 >> fwrite(fid,a,'double') ans = 9 %表示写入了9个数据 >> fclose(fid)

Matlab文件操作及读txt文件(fopen,fseek,fread,fclose)

Matlab文件操作及读txt文件(fopen,fseek,fread,fclose) matlab文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,…打开方式?) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下: λ…r?:只读方式打开文件(默认的方式),该文件必须已存在。 …r+?:读写方式打开文件,打开后先读后写。该文件必须已存在。λλ…w?:打开后写入数据。该文件已存在则更新;不存在则创建。 …w+?:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。λ λ…a?:在打开的文件末端添加数据。文件不存在则创建。

…a+?:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如…rt?或…wt+?,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen 函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(…all?)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据

matlab文件操作及读txt文件

matlab文件操作及读txt文件 matlab文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下: λ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。λλ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。λ λ‘a’:在打开的文件末端添加数据。文件不存在则创建。 λ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。

另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:test.bin','wb') %以二进制数据写入方式打开文件

matlab文件的导入导出

GprMaxV2.0中GprMax2D输入文件的命令(1/2) 原创 修改人 修改时间 版本 微风无尘 微风无尘 2012.3.9 V1.1 实验环境: 操作系统:Windows 7 软件版本:MATLAB 7.1 & GprMaxV2.0 参考文献: GprMaxV2.0软件manual文件夹下的UserGuideV2.pdf。 GprMaxV2.0下载地址:https://www.sodocs.net/doc/f45096623.html,/Download.html 说明:翻译得不好,还望大家见谅,因为我也是边看边译的。 3.1 GprMax2D命令的一般注意事项 为了描述GprMax2D/3D命令及其参数,我们作以下约定: f表示浮点数(如1.5或15e-1、1.5e1) i表示整数

c表示字符 str表示字符串 file表示输入文件名 所有空间距离的基本单位为米 所有时间的基本单位为秒 所有频率参数的基本单位是Hz 3.2 GprMax2D 2.0版本共有32条命令:#title: #domain: #dx_dy: #time_step_stability_factor: #time_window: #messages: #number_of_media: #nips_number: #media_file: #geometry_file: #medium: #abc_type:

#abc_order: #abc_stability_factors: #abc_optimization_angles: #abc_mixing_parameters: #pml_layers: #box: #cylinder: #x_segment: #y_segment: #triangle: #analysis: #end_analysis: #tx: #rx: #rx_box: #snapshot: #tx_steps: #rx_steps: #line_source: #excitation_file:

Matlab实用操作指令

matlab编辑器的快捷键 在编辑器(Editor>中: 1> 【Tab】<或【Ctrl+]】)――增加缩进<对多行有效) 2> 【Ctrl+[】--减少缩进<对多行有效) 3> 【Ctrl+I】--自动缩进<即自动排版,对多行有效) 4> 【Ctrl+R】――注释<对多行有效) 5> 【Ctrl+T】――去掉注释<对多行有效) 6> 【Ctrl+B】――括号配对检查<对版本6.5有效,但版本7.0无效,不知道是取消了还是换了另外的快捷键,请大牛们指点,其他版本没有测试过) 7> 【F12】――设置或取消断点 8> 【F5】――运行程序 matlab命令 一、常用对象操作:除了一般windows窗口的常用功能键外。 1、!dir 可以查看当前工作目录的文件。 !dir& 可以在dos状态下查看。 2、who 可以查看当前工作空间变量名, whos 可以查看变量名细节。 3、功能键: 功能键快捷键说明 方向上键 Ctrl+P 返回前一行输入 方向下键 Ctrl+N 返回下一行输入 方向左键 Ctrl+B 光标向后移一个字符 方向右键 Ctrl+F 光标向前移一个字符 Ctrl+方向右键 Ctrl+R 光标向右移一个字符 Ctrl+方向左键 Ctrl+L 光标向左移一个字符 home Ctrl+A 光标移到行首 End Ctrl+E 光标移到行尾 Esc Ctrl+U 清除一行 Del Ctrl+D 清除光标所在的字符 Backspace Ctrl+H 删除光标前一个字符 Ctrl+K 删除到行尾 Ctrl+C 中断正在执行的命令 4、clc可以命令窗口显示的内容,但并不清除工作空间。 二、函数及运算 1、运算符: +:加,-:减, *:乘, /:除, \:左除 ^:幂,‘:复数的共轭转置, <):制定运算顺序。2、常用函数表: sin( > 正弦<变量为弧度) Cot( > 余切<变量为弧度) sind( > 正弦<变量为度数)

matlab文件操作fopen,fseek,fread,fclose等

文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,…打开方式?) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下: …r?:只读方式打开文件(默认的方式),该文件必须已存在。λ …r+?:读写方式打开文件,打开后先读后写。该文件必须已存在。λ …w?:打开后写入数据。该文件已存在则更新;不存在则创建。λ …w+?:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。λ …a?:在打开的文件末端添加数据。文件不存在则创建。λ …a+?:打开文件后,先读入数据再添加数据。文件不存在则创建。λ 另外,在这些字符串后添加一个“t”,如…rt?或…wt+?,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(…all?)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件 fid = 3 %其值大于0,表示打开成功 >> fwrite(fid,a,'double') ans = 9 %表示写入了9个数据

MATLAB文件操作详解

matlab文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。 ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。‘a’:在打开的文件末端添加数据。文件不存在则创建。 ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose 函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用

matlab常用基本命令

有关命令行环境的一些操作: (1) clc擦去一页命令窗口,光标回屏幕左上角 (2) clear从工作空间清除所有变量 (3) clf清除图形窗口内容 (4) who列出当前工作空间中的变量 (5) whos列出当前工作空间中的变量及信息?(6) delete <文件名> (7) which <文件名> (9) clear all (10) help <命令名> (11) save name (12) save name x y (13) load name (14) load name x y (15) diary name1.m (16) type name.m (17) what 快捷键: Ctrl+p Ctrl+n Ctrl+b Ctrl+f

Ctrl + ← Ctrl+r Ctrl + → Ctrl+l Home Ctrl+a End Ctrl+e Esc Ctrl+u Del Ctrl+d 或用工具栏上的Workspace 浏览器从磁盘删除指定文件 查找指定文件的路径 从工作空间清除所有变量和函数 查询所列命令的帮助信息 保存工作空间变量到文件name.mat 保存工作空间变量x y到文件name.mat 下载‘name’文件中的所有变量到工作空间 下载‘name’文件中的变量x y到工作空间 保存工作空间一段文本到文件name1.m 在工作空间查看name.m文件内容 列出当前目录下的m文件和mat文件 调用上一次的命令 调用下一行的命令 退后一格 前移一格

向右移一个单词 向xx一个单词 光标移到行首 光标移到行尾 清除一行 清除光标后字符 Backspace Ctrl+h 清除光标前字符Ctrl+k 清除光标至行尾字Ctrl+c 中断程序运行一.常用的窗口命令 help 启动联机帮助文件显示 what 列出当前目录下的有关文件 type 列出M文件 lookfor 对help信息中的关键词查找which 找出函数与文件所在的目录名demo 运行MATLAB的演示程序 path 设置或查询MATLAB的路径 二.有关文件及其操作的语句 cd或ls 改变当前的工作目录 cd ..显示上一层目录 pwd 显示当前目录

matlab文件读写.doc

Matlab文件和数据的导入与导出 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍MATLAB中文件的读写和数据的导入导出。 13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。 13.1.1 文件的存储 MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。 1. 保存整个工作区 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。 2. 保存工作区中的变量 在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT 文件。 3. 利用save命令保存 该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下: ●save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为matlab.mat,MAT 文件可以通过load函数再次导入工作区,MA T函数可以被不同的机器导入,甚至可以通过其他的程序调用。 ●save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。 ●save('filename', 'var1', 'var2', ...):保存指定的变量在filename 指定的文件中。 ●save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。 ●save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。 ●save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。 ●save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。

matlab对文件目录操作及读写文件

Matlab对路径的操作及读写文件Matlab在数学运算方面有着强大的功能,同时在程序编写方面也有一定的优势。Matlab 可用作函数、脚本、封装成类,同时提供了与常用编程语言的接口。这时,matlab对文件目录和文件的操作有着重要的作用。 一、matlab对路径的操作 1、filesep 用于返回当前平台的目录分隔符,Windows是反斜杠(\),Linux是斜杠(/)。 2、fullfile 用于将若干字符串连接成一个完整的路径。例如: >> f=fullfile('D:','Matlab','example.txt') f=D:\Matlab\example.txt (在Windows中,“D:\”表示D盘,“D:”表示目录) 3、fileparts 用于将一个完整的文件名分割成4部分:路径,文件名,扩展名,版本号。例如:>> f=fullfile('D:','Matlab','example.txt'); >>[pathstr,name,ext,versn]=fileparts(f) pathstr=D:\Matlab name=example ext=.txt versn=’’ 4、pathsep 返回当前平台的路径分隔符。Windows是分号(;),Linux是冒号(:)。 5、exist 可以用于判断目录或者文件是否存在,同时不同的返回值有不同的含义。例如: >> f=fullfile('D:','Matlab','example.txt'); >>exist(f) ans=2 >>exist('D:\Matlab') ans =7 6、which 可以通过一个函数或脚本名称得到它的完整路径,同时还能处理函数重载的情况,例如:>> which abs(0) C:\MA TLAB7\toolbox\matlab\elfun\@double\abs.bi % double method >> which abs(single(0)) C:\MA TLAB7\toolbox\matlab\elfun\@single\abs.bi % single method 7、isdir 判断一个路径是否代表了一个目录,例如: >> p='D:\Matlab'; >> f=fullfile(p,'example.txt'); >> isp=isdir(p) isp=1 >> isf=isdir(f) isf=0

matlab进行文件读写操作

matlab进行文件读写操作 输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下: ?‘r’:只读方式打开文件(默认的方式),该文件必须已存在。?‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。?‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。?‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。 ?‘a’:在打开的文件末端添加数据。文件不存在则创建。 ?‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。

另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen 函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8将一个二进制矩阵存入磁盘文件中。 >>a=[123456789]; >>fid=fopen('d:\test.bin','wb')%以

matlab文件操作及读txt文件及字符串操作

转载,网上摘录)在使用MATLAB遇到问题时,在网上搜索到很多有用的知识,比起看帮助文件的英文要省力的多了 matlab文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下: ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。 ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。 ‘a’:在打开的文件末端添加数据。文件不存在则创建。 ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件 fid = 3 %其值大于0,表示打开成功 >>fwrite(fid,a,'double') ans = 9 %表示写入了9个数据 >>fclose(fid) ans =

Matlab的各种数据读取、文件读写等操作汇总

Matlab的各种数据读取、文件读写等操作汇总 MATLAB提供了多种方式从磁盘读入文件或将数据输 入到工作空间,即读取数据,又叫导入数据;将工作空间的变量存储到磁盘文件中称为存写数据,又叫导出数据。至于选择哪种机制,则根据下面两个因素决定:● 用户所执行的操作是导入数据还是导出数据;● 数据的格式为文本格式、二进制格式还是如HDF之类的标准格式。将数据导入MATLAB中最容易的方法就是使用导入数据模板(Import Wizard),使用该模板时不需要知道数据的格式,只需指定包含这些数据的文件,然后导入模板会自动处理文件内容。本章重点内容如下:● 文件的打开和关闭● 文本文件的读取● 存写ASCII数据● 二进制数据的读取● 二进制数据的存写● 使用I/O文件函数进行数据读写● MAT 文件的读写 2.1 文件的打开和关闭2.1.1 文件的打开无论是要读写ASCII码文件还是二进制文件,都必须先用fopen函数将其打开,在默认情况下,fopen以二进制格式打开文件,它 的使用语法如下:fopen ('filename', 'mode')其中filename 表示要读写的文件名称,mode则表示要对文件进行的处理 方式,如下:rt:以只读方式(Reading)打开文件wt:以只写方式(Writing)打开文件at:以追加方式(Appending)打开文件,新内容将从原文件后面续写r+t:以同时读写方式打开文件

w+t:以同时读写创建文件,原文件内容被清除a+t:以同时读和追加(Reading and Appdending)方式,原文件内容被保留,新内容将从原文件的后面开始At:以读写方式打开或创建文件,适用于对磁带介质文件的操作Wt:以写入方式打开或创建文件,原文件内容被清除,适用于磁带介质文件的操作 fopen函数有两个返回值,一个是返回一个文件标志(file Identifier),它会作为参数被传入其他对文件进行读写操作的命令,通常是一个非负的整数,可用此标识来对此文件进行各种处理。如果返回的文件标识是–1,则代表fopen无法打开文件,其原因可能是文件不存在,或是用户无法打开此文件权限。另一个返回值就是message,用于返回无法打开文件的原因。为了安全起见,最好在每次使用fopen函数时,都测试其返回值是否为有效值。下面以脚本m文件为例来声明文件的打开。例 2-1 %exam1.m[f,message]=fopen('fileexam1', 'r')if f==-1disp (message); %显示错误信息end若文件fileexam1不存在,则显示如下信息。Cannot open file.existence?permissions?memory?... 例2-2 %exam2.m[f,message]=fopen('fileexam2', 'r');if f==-1disp (message); %显示错误信息else disp(f);end若文件fileexam2存在,则返回f值。

matlab常用文件操作 总结

若不能运行,请注意标点符号是否为英文半角和拼写,如果功能错误请使用help mtf 格式等图像读取: imread pic1=imread('filename.tif',1) pic1=imread('filename.tif',10) 写图像文件: imwrite 文件名必须包括指明格式的扩展名。也可以增加第三个参数,显式指明文件的格式 imwrite(f, 'filename') 获取图像信息: imfinfo pic0info=imfinfo('sedat0.tif'); 新建文件夹 mkdir mkdir('temp') mkdir('temp\folder0') 创建子目录并直接向文件夹写文件: 先用 mkdir(dirName) 来创建文件夹 再用imwrite(I,'dirName\图象.jpg'); 文件夹跳转并设为当前目录: cd cd('temp') cd('temp\folder0') cd temp cd temp\folder0 cd .. 跳往上级目录 str=cd 获取当前完整目录

获取上级目录和获取文件名(去掉扩展名的方法) Filepath='c:a\b\c' Pathpos=strfind(Filepath,'\') Filepath1= Filepath(1: Pathpos(end)-1) filename='abc.txt' namepos=strfind(filename,'.') filename1=filename(1:namepos(end)-1) 使用文件夹对话框 mydir=uigetdir('c:','选择一个目录'); path=uigetdir filelist=dir(fullfile(path,'*.tif')); 使用文件夹对话框 [picname,picpath]=uigetfile('*.tif','selecttiffile'); 遍历文件夹内所有文件dir(包括文件和文件夹,每个文件的信息,自己的信息等) file=dir 遍历文件夹内特定格式文件 files = dir('*.tif'); path=uigetdir t = cd(path);% t为跳转前的目录, % do something allnames = struct2cell(dir); % dos命令dir列出所有的文件,用struct2cell转换为元胞数组 cd(t)

MATLAB文件各种操作方法

文件的打开和关闭 文件的打开 fopen ('filename', 'mode') mode格式有: ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。 ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。 ‘a’:在打开的文件末端添加数据。文件不存在则创建。 ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 如果rt表示该文件以文本方式打开,如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 Fopen函数两个返回值: 1、一个是返回一个文件标识(file Identifier),它会作为参数被传入其他 对文件进行读写操作的命令,通常是

一个非负的整数,可用此标识来对此文件进行各种处理。(如果返回的文件标识是–1,则代表fopen无法打开文件,其原因可能是文件不存在,或是用户无法打开此文件权限); 2、另一个返回值就是message,用于返 回无法打开文件的原因; 例:1-1 [f,message]=fopen('fileexam1', 'r') if f==-1 disp(message); %显示错误信息 end (若文件fileexam1不存在,则显示如下信息。 Cannot open permissionsmemory) 例:1-2 [f,message]=fopen('fileexam2', 'r'); if f==-1 disp (message); %显示错误信息 else disp(f); end 若文件fileexam2存在,则返回f值。 文件的关闭 Fclose(f) F为打开文件的标志,若若fclose函数返回值为0,则表示成功关闭f标志的文件;若返回值为–1,则表示无法成功关闭该文件。(打开和关闭文件比较耗时,最好不要在循环体内使用文件) 若要一次关闭打开的所有文件,可以使用下面的命令:fclose all 文本数据 MATLAB自带的MAT文件为二进制文件,但为了便于和外部程序进行交换

将Matlab中的矩阵写入txt文件的方法

将Matlab中的矩阵写入txt文件的方法 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:λ ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 λ ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。 λ ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 λ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。λ ‘a’:在打开的文件末端添加数据。文件不存在则创建。 λ ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose 函数,调用格式为: sta=fclose(fid)

说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用 fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A 用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件fid = 3 %其值大于0,表示打开成功 >> fwrite(fid,a,'double') ans = 9 %表示写入了9个数据 >> fclose(fid) ans = 0 %表示关闭成功 2)读二进制文件 fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:[A,COUNT]=fread(fid,size,precision)

相关主题