概述
先写一些,积累多点再来补充~
一 输入
1.input
input 的应用形式主要有以下两种,其中第一个输入的数字,第二个输入的是文本信息(一般为字符串)
x = input(prompt)
str = input(prompt,'s')
式中,prompt 代表要展示的文本信息,例如 a=input('please input a numbern') ,会在命令行上显示 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
按列顺序填充 A
。sizeA
必须为正整数或采用 [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详解)
数值格式
这些样式可控制数值变量的输出显示格式。
| 结果 | 示例 |
---|---|---|
| 固定十进制短格式,小数点后包含 4 位数。 | 3.1416 |
| 长固定小数格式, | 3.141592653589793 |
| 短科学记数法,小数点后包含 4 位数。 | 3.1416e+00 |
| 长科学记数法, | 3.141592653589793e+00 |
| 短固定小数格式或科学记数法(取更紧凑的一个),总共 5 位。 | 3.1416 |
| 长固定小数格式或科学记数法(取更紧凑的一个),对于 | 3.14159265358979 |
| 短工程记数法,小数点后包含 4 位数,指数为 3 的倍数。 | 3.1416e+000 |
| 长工程记数法,包含 15 位有效位数,指数为 3 的倍数。 | 3.14159265358979e+000 |
| 正/负格式,对正、负和零元素分别显示 | + |
| 货币格式,小数点后包含 2 位数。 | 3.14 |
| 二进制双精度数字的十六进制表示形式。 | 400921fb54442d18 |
| 小整数的比率。 | 355/113 |
除此,也可以设置矩阵输出时的行距格式:
| 结果 | 示例 |
---|---|---|
| 隐藏过多的空白行以便在一个屏幕上显示更多输出。 | theta = pi/2 |
| 添加空白行以使输出更易于阅读。 | theta = pi/2 |
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 %12sn','x','exp(x)');
fprintf(fileID,'%6.2f %12.8fn',A);
fclose(fileID);
在输出前首先需要打开文件(fopen),输出结束后需要关闭文件(fclose),如上所示。其中,fopen函数里的是文件名以及标识符,标识符类别有以下8种,若是要创建新文件则是 w ,若是在原有文件里补充则是 a ,一般用到的就这两种。
| 打开要读取的文件。 |
| 打开或创建要写入的新文件。放弃现有内容(如果有)。 |
| 打开或创建要写入的新文件。追加数据到文件末尾。 |
| 打开要读写的文件。 |
| 打开或创建要读写的新文件。放弃现有内容(如果有)。 |
| 打开或创建要读写的新文件。追加数据到文件末尾。 |
| 打开文件以追加(但不自动刷新)当前输出缓冲区。 |
| 打开文件以写入(但不自动刷新)当前输出缓冲区。 |
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.
大致的输入输出操作就到这儿了,更多内容还需继续进修~一般来说这些输入输出就足够了
最后
以上就是诚心草莓为你收集整理的(一)MATLAB中的输入与输出一 输入二 输出的全部内容,希望文章能够帮你解决(一)MATLAB中的输入与输出一 输入二 输出所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复