遇到了将一个矩阵分为几个子矩阵并分别对子矩阵进行操作的问题,经网上搜索测试,学习使用mat2cell及相应的cellfun,下面是一些个人的理解。
先说mat2cell函数,从函数名可以看出,这个函数的作用就是将矩阵分为几个子矩阵,也就是所谓的胞元(cell)。为了说清楚这个函数的作用,先引入数学中的一个概念叫做笛卡儿积,具体概念示例如下图:
在mat2cell函数中,有三个参数,第一个参数是想要分解的矩阵,第二个和第三个参数一般都是集合的形式,表示分解的尺度。分解得到的子矩阵的大小就是按照第二个和第三个参数的笛卡儿积来确定的。举一个例子:
res=mat2cell(x,[1 2 3],4)
这行代码的作用就是将矩阵x分解为3个矩阵,其大小分别为1*4,2*4和3*4。需要注意的是,分解产生的子矩阵拼接起来必须等于原始矩阵,这是很显然的一个要求,但是初次使用的时候不注意就会报错。这适合可能会有一个问题,比如说原始矩阵规模相对较大,我要是想分解成20个8*4的矩阵,难道需要在第二个参数中写入20个8吗?显然这是费时费力的。此时可以借助ones函数来实现类似的功能:
seg1=8*ones(20,1);
res=mat2cell(x,seg1,4);
问题就迎刃而解了。方便起见,以上示例固定了第三个参数,假设了原矩阵只有4列,实际上其也是可以根据个人需要进行设定的。
现在新问题出现了,如果我相对每一个子矩阵进行求和等操作,难道需要考虑位置关系借助for循环来实现吗?直觉上应该有更简单的实现方法,这也就是相关的cellfun了。下面对cellfun进行相关的解释说明。
cellfun的操作对象就是cell数组,可以利用一些定义的函数批量处理cell2mat产生的子矩阵。下面通过简单的例子来说明,具体细节我没有认真研究,记住调用的格式就好了。