下面是最近使用matlab常用的一些方法总结,不断更新,方便以后查阅!
问题1:如果我想把matlab仅仅是当成一个计算器来使用呢?或者说高级点的计算器?不想开UI界面,能在命令行下快速启动。
简单,只需运行:
./matlab -nosplash -nodesktop -nojvm
nosplash就是省去启动界面
nodesktop和nojvm应该都是关闭UI界面的
然后就能在控制台下进行操作了。方便快捷。
问题2:如何导入格式化文本文件
这里的文本文件指的是ASCII编码的。
可以使用importdata命令例如:
data = importdata('./text.txt',' ',2);
读取当前目录下文件名为text.txt的文本文件,并且以空格作为分割符号,2指的是该文件前两行是说明文字,不是我们需要的,所以跳过。。如果不存在就不用这个参数了。
详细help importdata
这里导入的文件 每行数据必须得是列相同,或者比开头的列少,否则会被分割成多行了。
如果要导入非格式化的文本文件,我们可以采用类似open read的函数调用来操作文件。
问题3:如何导入非格式化的文本文件
这里可以使用fopen来打开文件,和c下是一样的,返回文件句柄,我们知道,在Unix下,0 1 2文件句柄分别表示了STDIN STDOUT STDERR,如果我们继续打开文件,那么句柄就会递增,同样的这里也是。。
fid=fopen('filename','permission');
filename就是文件名了,permission就是文件的权限
'r' open file for reading
'w' open file for writing; discard existing contents
'a' open or create file for writing; append data to end of file
'r+' open (do not create) file for reading and writing
'w+' open or create file for reading and writing; discard
existing contents
'a+' open or create file for reading and writing; append data
to end of file
'W' open file for writing without automatic flushing
'A' open file for appending without automatic flushing
然后利用该文件句柄就可以打开文件,或者修改文件
可以用fread fwrite frewind fclose 进行各自操作。。。
但是这里读入都是我们指定解码的格式,不妨便,可以使用行输入;
fgets可以返回当前行,同时fid对应的文件指针下移动,返回当前行包括最后的换行符,如果不想要换行符号,可以使用fgetl
fid = fopen(filename);
num = 0;
while fid
line = fgetl(fid);
if ~ischar(line)
break;
end
num = num+1;
end
info = sprintf('the total num:%d',num);
disp(info);
fclose(fid);
上面小例子就简单打印出行数。
问题4:如何批处理文件
批处理文件,其实最主要的就是能够读入批量文件,然后要怎么处理就转换成单文件循环处理罢了。
利用dir命令,可以显示某个路径下的文件,
dir
直接显示当前目录下文件,记得返回的是一个结构体数组,同时文件也包括. 和 .. 这两个小东西
dir('../img/*.jpg')
可以带参数,表示你的目标路径,如果只是简单跟路径,返回的也是那个路径下所有文件,如果你需要过滤,可以用上数通配符方式
问题5:什么是cell类型啊!!!!
不用怕,五分钟,让你爱上cell类型!!尤其对于有一点点点点c编程经验的人。。!!!如果懂得Java的hashmap那就更是能和struct这个结构贯通了。。。
这个数据类型确实是我们以前从未见过,不都只有uint8 uint16 uint32 double char ....
我这里举个例子,说明下为什么会需要cell这个类型;)
我们都知道,在C语言里面可以动态创建数组,即malloc可以随时需要的时候分配出堆空间,这种语言特性使得我们可以使用链表这种结构。
例如,我们在生成一个二维数组的时候,可以使用这种指针的数组来创建。假设现在有如下数据:
4 1 2 3 4
3 3 56 6
6 4 8 3 1 5 7
希望你能表示在一个数组里,该数据的每行开头是后面数据元素的个数,当然我们使用传统的静态数组是无法满足这种动态改变的特性,而且数组长度不等这就让我们头疼了,先生成一个大树组???空间利用率太低了,所以我们先生成一个指向指针的指针 int **arr;然后再以此动态分配空间;
如果在matlab下如何实现呢?
我们的数组都是静态的,而且列不同,比行不同更蛋疼。。。
有指针么?好像没见过,这就cell随之产生了。
cell里面每个元素可以装任何数据类型,这就相当与cell每个元素都可以作为一个指向我们的数据元素的指针了。
cell的每个单元都可以存储任何数据,比如传递函数等。当然,存储矩阵更是没有问题的了。但是用cell数据类型之前,要先初始化。
a=cell(n,m)
那么就把a初始化为一个n行m列的空cell类型数据。
如何赋值呢?
a{1,1}=rand(5)
那么a的1行1列的单元中存储的就是一个随机的5×5的方阵了。
那么要用第一个单元中的方阵中的某个值呢?
可以如下引用:a{1,1}(2,3)
就可以了,引用cell单元时要用{},再引用矩阵的某个数据就要用()了。
cell单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。
------------------------多说无益,举个实际例子,仍然是上面那个c语言例子:
>> ces=cell(3,1);
>> ces{1}=[4 1 2 3 4];
>> ces{2}=[3 3 56 6];
>> ces{3}=[6 4 8 3 1 5 7];
>> ces
ces =
[1x5 double]
[1x4 double]
[1x7 double]
>> sum(ces{1}(2:end))
ans =