MATLAB3: 矩阵分块函数mat2cell 及 cellfun 函数
MATLAB 矩阵分块函数 mat2cell 及 cellfun 函数
mat2cell 函数就是将矩阵转化成胞元数组(cell array),用数学的语言讲就是矩阵分块。x是60*50的大矩阵。
cellfun 函数就是对每一个块做相同的操作,例如求和、求均值等等,用这个函数就避免了写 for 循环了,也算是 matlab 向量化运算的一个例子。
y=cell2mat(c)
这里y相当于大矩阵x
>> matrix
>> mc{1,1}
>> mc{1,2}
>> sum_of_everyone = cellfun(@(x) sum(x(:)), mc)
matlab中cell数组用法
cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
1.cell数组的创建
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
2.cell数组的访问
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
3.cell数组相关的函数
cell:创建空的元胞数组,预分配内存
celldisp:显示元胞数组所有内容
cellplot:利用图形方式显示内容(因缺思厅!)
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
mat2cell:将普通矩阵转化成元胞数组
iscell:判断输入是否为元胞数组
cellfun:为cell数组的每个cell单元执行指定的函数,fun可以是特殊的函数或者句柄
b={[1,2,1];[2,1,1];[1,1,2]};
c=cellfun(@(x)(mat2str(x)),b,'un',0)
更一般的例子参见https://cn.mathworks.com/matlabcentral/answers/99632-how-do-i-save-a-cell-array-that-contains-both-strings-and-numbers-to-an-ascii-file-in-matlab
4.cell单元的删除
我们知道矩阵及矩阵的删除可以通过[]实现:
元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
a={1,2,3};
a{1}=[];%并不能删除第一个cell单元,只是变成空值
a(1)=[];%删除第一个单元
a(:)=[];%一次性删除所有cell单元
如果p为一个数,那么h(1)=p,是没有问题的。
如果p为一个向量,那么h(1,:)=p是没有问题的。
如果p是一个矩阵的话,上面的两种赋值方法都是会有错误的。
那么要如何处理呢?
这时就用到了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单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。
cellfun函数的问题
你想实现什么功能?
str2num的作用是把字符串转换为数值类型,字符串'00110011'转为数值型当然就是110011了。
至于cellfun,无非是对于一个cell数组中的每个单元都进行str2num操作。
MATLAB胞元数组函数cellfun输出错出
就是一致性输出的问题
如果函数返回的是一个标量,cellfun可以用一致输出,函数会把输出合并成一个矩阵
矩阵的维度大小和原来的cell数组的维度大小一致
如果函数返回不是标量,就不能用一致输出
你的函数 返回的是3x1的矩阵,所以不能用一致输出,必须用非一致输出
B=cellfun(@(x)(A+E)*x,C,'UniformOutput',0)
怎样用matlab计算一个矩阵和大量矩阵分别相乘
方法一,可以使用for循环;
方法二,可以使用cellfun函数.将大量矩阵保存成cell数组.
示例:
a=rand(3,2); %a某个矩阵
B={rand(2,2),rand(2,3),rand(2,4),rand(2,5),rand(2,6)}; %B大量矩阵组成的cell数组
C=cellfun(@(x)a*x,B,'UniformOutput',fal); %分别将矩阵a与B中每个矩阵相乘.
%C为结果,也是cell数组
由结果可知:
C{1} = a*B{1}
C{2} = a*B{2}
C{3} = a*B{3}
C{4} = a*B{4}
C{5} = a*B{5}