matlab编程入门学习(6)
2014-01-03 16:00
399 查看
第七章、稀疏矩阵 单元阵列 结构
7.1、系数矩阵
稀疏矩阵是为了改变运算时候的浪费现象,很多的时候其实我们的问题遇到的都是稀疏问题先直接列出一些稀疏矩阵的函数参考
给出个用稀疏矩阵解方程组的例子:
有这么一个方程,现在来求解一下:
a = [1.0 0.0 1.0 0.0 0.0 2.0 0.0 -1.0; ... 0.0 1.0 0.0 0.4 0.0 0.0 0.0 0.0; ... 0.5 0.0 2.0 0.0 0.0 0.0 -1.0 0.0; ... 0.0 0.0 0.0 2.0 0.0 1.0 0.0 0.0; ... 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0; ... 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0; ... 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.0; ... 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0]; b = [ 3.0 2.0 -1.5 1.0 -2.0 1.0 1.0 1.0]'; tic X = a\ b; toc %fprintf('the time is %6.6f\n',toc); disp('the solution of this equation is:'); disp(X); as = sparse(a); bs = sparse(b); tic xs = as \ bs; toc disp('the solution of this equation is:'); disp(xs);两种方法都得出了结果,但是原始方法貌似时间耗费的少点,不太明白为什么会是这样的!
7.2 单元阵列(cell array)
单元阵列是MATLAB 中特殊一种数组,它的元素被称为单元(cells),它可以存储其它类型的MATLAB 数组。创建单元阵列有两种方法:
1、用赋值语句
2、用函数cell创建
用复制语句创建的方式也有两种方式,第一种是内容索引的方式,第二种是单元索引的方式。
千万不要创建一个与workspace中重名的一个cell,因为这样可能会导致错误的发生,虽然我也不是很明白为什么会是这个样子!!
总结:
函数 描述
cell 对单元阵列进行预定义
celldisp 显示出单元阵列的内容
cellplot 画出单元阵列的结构图
cellstr 把二维字符数组转化为相应的字符串单元阵列
char 把字符串单元阵列转化相应的字符数组
7.3 结构数组
一个数组是一个数据类型,这种数组类型有一个名字,但是在这个数组中的单个元素只能通过已知的数字进行访问。数组arr 中的第五个元素可由arr(5)访问。注意在这个数组中的所有元素都必须是同一类型(数字或字符)。一个单元阵列也是一种数据类型,也有一个名字,单个元素也只能通过已知的数字进行访问。但是这个单元阵列中元素的数据类型可以是不同的。相对地,一个结构也是一种数据类型,它的每一个元素都有一个名字。我们称结构中的元素为域。单个的域可以通过结构名和域名来访问,用句号隔开。
创建结构两种方法:
1、用赋值语句创建
2、用函数struct进行创建
感觉和C语言中的结构体是一个道理!
stu(1).name = 'jim'; stu(1).age = 26; stu(1).sex = 'M'; stu(2).name = 'kate'; stu(2).age = 22; stu(2).sex = 'W'; disp(stu(1)); disp(stu(2)); for i=1:length(stu) disp(stu(i)); end简单应用,很简单!!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第八章 输入/输出函数
这一章中我们会具体的学习matlab中的输入输出,据说和C语言中的很像,希望是吧,俺也就会点点C语言!8.1、函数textread
textread可以按列读取文件中的元素,每一列都可能出现不同的数据类型。形式如下:[a, b, c, ...] = textread(filename, format, n)其中filename 代表要打开的文件的名字,format 是用于每一行数据类型的字符串,n 代表要读取的行数(如果没有n,则这个命令将读完这个文件)。格式化字符串与函数fprintf 格式化描述的字符串相同。
我自己建了个txt文件,代码如下:
[first,last,blood,age]=textread('E:\\abc.txt','%s %s %s %*f %d %*s')把不需要的内容用%*代替掉,如果不这样的话会错误,牢记!
8.2、文件的打开和关闭
8.2.1、fopen函数
fopen函数打开一个文件的形式如下:fid = fopen(filename, permission) [fid, message] = fopen(filename, permission) [fid, message] = fopen(filename,permission, format)其中filename是要打开的文件的名字,permission是指定打开文件的方式,formart是一个参数字符串,用于指定文件中数据的数字格式。如果文件被成功打开,在这个语句执行之后,fid 将为一个正整数,message 将为一个空字符。如果文件打开失败,在这个语句执行之后,fid 将为-1,message 将为解释错误出现的字符串。
打开方式我就直接copy了,和C的一样!
文件permission 意义
'r' 以只读格式读取文件
'r+' 可对文件进行读写
'w' 删除一个已存在文件的内容(或创建一个新文件),并以只写格式打开
'w+' 删除一个已存在文件的内容(或创建一个新文件),并以读写格式打开
'a' 打开一个已存在的文件(或创建一个新文件),并以只写文件格式打开把写入的内容增加到文件的结尾
'a+' 打开一个已存在的文件(或创建一个新文件),并以只写文件格式打开把写入的内容增加到文件的结尾
'W' 不进行自动洗带的写入数据(针对于磁带机的特殊命令)
'A' 不进行自动洗带的添加数据(针对于磁带机的特殊命令)
8.2.2、fclose函数
fclose函数的形式如下:status = fclose(fid) status = fclose('all')其中fid 为文件标识,status 是操作结果,如果操作成功,status 为0,如果操作失败,status 为-1。
8.2.3、fwrite函数
以自定义的格式把二进制数据写入到一个文件中。形式如下:count = fwrite(fid, array, precision) count = fwrite(fid, array, precision skip)
其中fid是用于fopen打开的一个文件的文件标识,array是写出变量的数组,count是写入变量的数目。
看下简单的操作代码把一个3维数组写入到指定的文件中。
a = [1,2,3;4,5,6;7,8,9]; fid = fopen('E:\\abc.txt','w'); for i = 1:size(a,1) for j = 1:size(a,2) fwrite(fid,int2str(a(i,j))); fprintf(fid,'\t'); end fprintf(fid,'\r\n'); end写入到文件中的回车和我们想象的不是很一样,一般直接用\n就可以了但是这里其实得用\r\n,这是文件流和数据流的差别!
8.2.4、fread函数
函数fread以用户自定义格式从一文件中读取二进制数据。它的形式如下:[array, count] = fread(fid, size, precision) [array, count] = fread(fid, size, precision, skip)
其中fid是用于fopen打开的一个文件的文件标识,array是包含有数据的数组,count是读取文件中变量的数目,size是要读取文件中变量的数目。
filename = input('Enter the file name:','s'); out_array = randn(1,10000); [fid,msg] = fopen(filename,'w'); if fid>0 count = fwrite(fid,out_array,'float64'); disp([int2str(count) ' values written...']); status = fclose(fid); else disp(msg); end [fid,msg] = fopen(filename,'r'); if fid>0 [in_array,count] = fread(fid,[100 100],'float64'); disp([int2str(count) ' values read...']); status = fclose(fid); else disp(msg); end
创建一个10000个随机数,然后写入到文件中形成一个100*100的二维数组。
8.2.5、fprintf函数
以用户自定义格式编写的格式化数据写入一个文件。它的形式如下:count = fprintf(fid, format, val1, val2, ...) fprintf(format, val1, val2, ...)其中fid 是我们要写入数据那个文件的文件标识,format 是控制数据显示的字符串。如果fid 丢失,数据将写入到标准输出设备(命令窗口)。
前后是必须的,中间的意义下表给出:
分别对应的是格式转换指定符和格式字符串的转义字符以及格式标识(修改符)。
8.2.6、fscanf函数
fscanf函数可以从一个文件中按用户指定的格式读取格式化的数据。形式如下:array = fscanf(fid, format) [array, count] = fscanf(fid, format, size)
其中其中fid 是所要读取的文件的文件标识(fileid),format 是控制如何读取的格式字符串,array 是接受数据的数组,输出参数count 返回从文件读取的变量的个数。参数size 指定从文件读取数据的数目。
8.3、其它函数
在打开文件之前,MATLAB 函数exist 用于判断这个文件是否存在。一旦一个文件打开,我们就可以用函数feof 和ftell 判断当前数据在文件中的位置。还用两个函数帮助我们在文件中移动:frewind 和fseek。到此基本上就差不多Matlab就差不多学完了,当然只是非常的皮毛的学习。后面的句柄函数和画图暂时就不学了,因为不太用的上,我的主要目的就是学习matlab并用在图像处理上面。
KEEP MOVING!!!!!