Matlab基础学习(3)

1.逻辑索引

向量化操作的要点是多使用 向量,减少使用循环,因为循环的效率不高。
向量化操作的一个难点是熟悉matlab的内置函数。上节已经列出来了一些,具体的还是要多查看help。
向量化编程的第二个要点是多使用逻辑索引,一般的索引已经说过。一般索引分为线性索引和行列索引。逻辑索引通过逻辑矩阵(0/1logical变量)提取相关元素。
定义一个m*n的矩阵A:
取A的(a,b)元素,一般索引A(a,b)
也可以使用逻辑索引:
B=zeros(m,n);
B(a,b)=1;
A(logical(B))
这只是为了生搬硬套的阐述思想,实际不可能这么做。
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
array(array>1)=0;
把大于1小于3的变成0。
array(and(array>1,array<3))=0;
通过逻辑矩阵可以很快的定位元素。
 
 
下面介绍一些is_函数:
iscell()
ischar() %字符数组
isempty()
isequal(A,B,...) %是否一样
isinfinite() %inf或nan
ishandle() %函数句柄
isglobal() %全局变量
isstruct()
isnumeric()%数字
islogical()
isnan()
isreal() %实数
isscalar() %标量
issorted() %有序
ismember(A,S) %判断数组A是否在数组S中
 
更多的is_函数,搜索is就可以找到。
 
类型转换:
类型转换函数有2大类:
a. A2B  %比如func2str()
b. A %比如logical()
我们说过,matlab数据类型有:
a.numeric:
搜索int,double
b.character
搜索char,str
c.function
搜索func
d.聚合数据类型
搜索cell,struct
e.logical
搜索logical
class()用于判断变量的类型
 
下面再举一个例子,计算数据中空值(nan)个数:
例如一个excel文件:
data=xlsread('reg.xls');
a=sum(isnan(data));
a是一个向量,向量中的值是每个属性为空值的个数。
 
 
data((data(:,11)<30)|(data(:,11)>80),:)=[];%将数据第11列小于30大于80的行删除
 
2. 提前分配内存
当矩阵较大时,预分配内存是提高程序效率的重要一点。
在运行一个函数或者代码段前,如果知道矩阵的大小,就可以先分配,再赋值。
zeros(m,n)或者zeros(m,n,'datatype').
注意,后一种的效率是更高的。
 
3.稀疏矩阵的处理
对于0较多的大型稀疏矩阵(如邻接矩阵,0/1矩阵等),尽量使用help-matlab-mathematics-sparse matrices里面的函数,这样会大大加快程序运行速度。
是不是sparse矩阵,可以用issparse()函数进行判断。
创建sparse矩阵:
spdiags() 稀疏的对角阵
speye() 稀疏的单位阵(单位阵本来就很稀疏)
sprand() 稀疏的均匀分布矩阵
sprandn()稀疏的正态分布矩阵
full和sparse转换:
full() %sparse->full
sparse() %full->sparse
基本操作:
nnz() %非零个数
nonzeros() %非零元素
spones() %将非零元素替换为1
spy() %绘制稀疏模式,例如spy(speye(100))就是一条直线
 
具体产看帮助,由于稀疏矩阵的特点,例如有时候条件数比较大,和图论的关系比较大等,matlab都设计了相应的函数。
 
 
 
 
 
posted @ 2015-12-08 16:22  霖霖柒  阅读(108)  评论(0)    收藏  举报