先写一些,积累多点再来补充~

一   输入

1.input

input 的应用形式主要有以下两种,其中第一个输入的数字,第二个输入的是文本信息(一般为字符串)

x = input(prompt)

str = input(prompt,'s')

式中,prompt 代表要展示的文本信息,例如 a=input('please input a number\n') ,会在命令行上显示 please input a number ,此时可以手动输入一个数字(若输入其他格式例如字符会报错)。这是程序不会继续运行,而是等待输入数字后回车方可继续运行,文本输入同理。详见MATLAB中的input函数

2.其它输入

输入数据也可以是导入和读取文件数据,MATLAB支持的数据格式多种多样,常见的主要有txt格式、xml格式等,再次仅对少数函数进行介绍,若想了解更多可以参考MATLAB数据导入与分析中的关于文本、表格、图像等格式文件的导入函数,本文主要介绍函数调用形式的输入输出。

2.1  fscanf

首先,使用 fscanf 函数读取的文件格式为文本格式,应用到的三种形式如下:

 A = fscanf(fileID,formatSpec) 将打开的文本文件中的数据读取到列向量 A 中,并根据formatSpec 指定的格式解释文件中的值。fscanf 函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果 fscanf 无法将 formatSpec 与数据相匹配,将只读取匹配的部分并停止处理。fileID(文件标识符)可以使用fileID = fopen('x.txt','a'); 的方式打开文件得到。formatSpec为数据段部分格式。

A = fscanf(fileID,formatSpec,sizeA) 将文件数据读取到维度为 sizeA 的数组 A 中,并将文件指针定位到最后读取的值之后。fscanf 按列顺序填充 AsizeA 必须为正整数或采用 [m n] 的形式,其中 m 和 n 为正整数(也可以是Inf  正无穷,表示读取对应的所有行/列/整块数据)。

[A,count] = fscanf(___) 还将返回 fscanf 读取到 A 中的字段数。对于数值数据,这是已读取的值数。您可以将此语法与前面语法中的任何输入参数结合使用。

然而,一般我是不用这个的。

2.2 load

load是MATLAB中最为常见的一种文件读取函数了,主要形式有以下五种:

load(filename)

load(filename,variables)

load(filename,'-ascii')

load(filename,'-mat')

load(filename,'-mat',variables)

可以是直接加载,形如 data=load('D:/test.txt'); 或者 data=load('D:/test.txt','x')读取 test.txt 中的x变量,其中x也可替换为多个变量组成的元胞数组,例如将x替换为var{:},其中var={'x','y','z'};除了 txt文本文件,还可以是MATLAB的数据类型mat格式文件(会直接输出到工作区中),ascii文件格式如第三个式子所示,会创建一个包含该文件数据的双精度数组。

通过load方式加载的数据尤为常见,在许多MATLAB的扩展函数中都可以见到,加载的格式也算是非常丰富的,文本文件,数据库文件或是表格文件都可以。

2.3 fopen

fopen 是打开文件,在下面fprintf函数中又对其各种格式的详细说明。通过fopen打开文件后,可以使用文本文件或字符串读取函数 textscan 来读取文件,调用格式如下:

fileID=fopen(filename);

C=textscan(fileID,formatSpec);

fclose(fileID);

打开文件后,textscan会尝试将文件中的数据与formatSpec中的转换设定符匹配。textscan函数在整个文件中按 formatSpec重复扫描数据,直至 formatSpec 找不到匹配的数据时才停止。

另外,也可以参考以下这种做法,将数据处理成元胞数组再转化为字符数组,运行结果如下

fileID = fopen('D:/test.txt','r');
rowdata = textscan(fileID, '%s', 'DElimiter', '\n');% 获得每行数据
fclose(fileID);
whos rowdata
rowdata{1}
%rowdata{2},会报错,rowdata为{1,1}元胞数组
a=rowdata{1,1}
whos a
b1=a{1,1}
whos b1

至于转换后的字符数组要怎么处理便是自己的事情了,这是相对于复杂输入类型的读取方式,更详细部分可以参考textscan。输入还是以 load 加载为主。


二   输出

常见的输出形式主要有三种:

1.直接输出到命令行

MATLAB允许在脚本(M文件)或者命令行上直接输入变量名即可输出,这种方法应用起来较为简单方便,适合测试时使用。但一般输出时时按照系统默认格式进行输出,若要调整需要在程序前通过 format 修改命令行输出格式,例如 format long 设置命令行输出格式为固定十进制长格式,同理可以设置为 short 短格式,更多的数值格式见下表所示(这些在MATLAB文档中都可以找到~format详解

数值格式

这些样式可控制数值变量的输出显示格式。

Style

结果

示例

short (default)

固定十进制短格式,小数点后包含 4 位数。

3.1416

long

长固定小数格式,double 值的小数点后包含 15 位数,single 值的小数点后包含 7 位数。

3.141592653589793

shortE

短科学记数法,小数点后包含 4 位数。

3.1416e+00

longE

长科学记数法,double 值的小数点后包含 15 位数,single 值的小数点后包含 7 位数。

3.141592653589793e+00

shortG

短固定小数格式或科学记数法(取更紧凑的一个),总共 5 位。

3.1416

longG

长固定小数格式或科学记数法(取更紧凑的一个),对于 double 值,总共 15 位;对于 single 值,总共 7 位。

3.14159265358979

shortEng

短工程记数法,小数点后包含 4 位数,指数为 3 的倍数。

3.1416e+000

longEng

长工程记数法,包含 15 位有效位数,指数为 3 的倍数。

3.14159265358979e+000

+

正/负格式,对正、负和零元素分别显示 +- 和空白字符。

+

bank

货币格式,小数点后包含 2 位数。

3.14

hex

二进制双精度数字的十六进制表示形式。

400921fb54442d18

rat

小整数的比率。

355/113

除此,也可以设置矩阵输出时的行距格式:

Style

结果

示例

compact

隐藏过多的空白行以便在一个屏幕上显示更多输出。

theta = pi/2
theta =
  1.5708

loose

添加空白行以使输出更易于阅读。

theta = pi/2

theta =

  1.5708

2 fprintf函数输出

fprintf函数是MATLAB函数中较为常见的一种(详见fprintf函数),因为它可以设置输出格式,较为灵活全面。最为常见的一种形式为: fprintf('%s is a boy',boyname) ,其中 boyname 表示一个存储字符串的变量名,同理这种形式可以输出十进制数(%d)、八进制数(%o)、定点记数法的浮点数(%f)以及指数记数法的浮点数(%e),单个字符(%c)和字符串(%s)。

如是需要控制输出的长度,可以在百分号后加上数字,例如 %8s 输出长度为八(若实际字符串长度超过八会输出字符串原身,不会截断),在命令行上至少保持8个占位,不够用空格来补,而 %4.8f 则会输出4位整数加小数点加8位小数的数字格式,与字符串不同的时,整数不够用空格补,小数不够用 0 来补。

前面所提的案例输出格式遵循右对齐的格式,若想变成左对齐则在百分号后数字或格式前加一个负号即可,例如 %-8s 。除此,我们还可以通过一些特殊的控制字符来维持输出格式的美观,例如 \t (水平)制表符,\n 换行符,\v 垂直制表符。

除此,fprintf函数还可以将数据输出到文件中存储起来,在MATLAB脚本中操作,格式案例如下:

x = 0:.1:1;
A = [x; exp(x)];

fileID = fopen('exp.txt','w');
fprintf(fileID,'%6s %12s\n','x','exp(x)');
fprintf(fileID,'%6.2f %12.8f\n',A);
fclose(fileID);

在输出前首先需要打开文件(fopen),输出结束后需要关闭文件(fclose),如上所示。其中,fopen函数里的是文件名以及标识符,标识符类别有以下8种,若是要创建新文件则是 w ,若是在原有文件里补充则是 a ,一般用到的就这两种。

'r'

打开要读取的文件。

'w'

打开或创建要写入的新文件。放弃现有内容(如果有)。

'a'

打开或创建要写入的新文件。追加数据到文件末尾。

'r+'

打开要读写的文件。

'w+'

打开或创建要读写的新文件。放弃现有内容(如果有)。

'a+'

打开或创建要读写的新文件。追加数据到文件末尾。

'A'

打开文件以追加(但不自动刷新)当前输出缓冲区。

'W'

打开文件以写入(但不自动刷新)当前输出缓冲区。

fclose 关闭文件,括号里面的fileID是文件标识符,即代表打开的文件,无特殊情况该语句也可以用 fclose('all') 关闭所有文件代替。而fprintf与前面输出到命令行的格式大致相似,不过在最前面加上了一个fileID~文件标识符而已。

3.disp

disp函数是直接输出,打印变量值或者打印字符串,形如 disp(x)和disp('x')表达的意思是不同的,前者是输出 x 的值,可以是字符串、整数、矩阵等等,而后者则是直接打印字符串 x ,打印完会直接换行,不像fprintf函数需要输入 \n 换行。同时,需要注意的是 disp 若是要在一行i打印字符串和变量值不能直接写成这种形式: disp('a is',a_value),这样会出现输入参数过多的错误(而在C#语言中使用$可以做到类似操作),但是可以写成类如以下形式来输出:

name = 'Alice';   
age = 12;
X = [name,' will be ',num2str(age),' this year.'];
disp(X)

这样会在一行里输出 :Alice will be 12 this year.

大致的输入输出操作就到这儿了,更多内容还需继续进修~一般来说这些输入输出就足够了

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐