我写这篇文章的目的就是为了能够将大矩阵简单的分为若干块,例如500x500的矩阵,分成100x100个5x5的分块矩阵。文档上只写了通过dim1Dist = [5,5,5,...,5,5]
对矩阵进行划分,但是我们不能直接写100个5,那样太麻烦了,我们这里有一个小技巧能够简单的进行划分。
我们先介绍一下mat2cell函数的用法:
mat2cell是将数组转化为在元胞中包含子数组的元胞数组,其中包括两种语法的用法
C = mat2cell(A,dim1Dist,...,dimNDist)
C = mat2cell(A,rowDist)
C = mat2cell(A,rowDist)
其中rowDist
指的是行分布,描述输入数组行分布情况的向量,指定为数值向量。当您未指定如何沿其他任何维度划分 A 时,mat2cell 函数将返回一个 n×1 元胞数组 C,其中 n 等于 rowDist 中的元素数。
rowDist
的每个元素指定 C 中对应元胞所含子数组的行数。rowDist
的元素总和必须等于 A 的行数。
A = reshape(1:20,5,4)'
A = 4×5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
划分 A 的行,以使元胞数组包含两个子数组。rowDist 的元素总和等于 A 的行数。划分后的结果为:
C{1} =
1 2 3 4 5
C{2} =
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
C = mat2cell(A,dim1Dist,...,dimNDist)
其中dim1Dist
是将大矩阵分成块的尺寸,每一块的尺寸和需要和大矩阵的尺寸相同,例如:大矩阵是9x9的矩阵,分块的大小是3x3的,
那么
dim1Dist = [3 3 3]
C = mat2cell(A,dim1Dist,dim1Dist)
这样我们就将原先的矩阵分成了3x3的9个分块。
但是如果矩阵过大,是个500x500的矩阵,我们如何避免写一个dim1Dist = [5,5,5,...,5,5]
而对矩阵进行分块处理。
这里我们有一个小技巧,我们的dim1Dist = ones(1, 100)*5
, 其中,ones(1, 100)
是生成一个1x100的全为1的矩阵,5
为我们需要分成的块的尺寸,这样,C = mat2cell(A,dim1Dist,dim1Dist)
就能直接把500x500的矩阵分成100x100个5x5的块。
如果看到了这里,对你有所帮助,能否动动你的小手指,点个赞呢~
参考文献
https://ww2.mathworks.cn/help/matlab/ref/mat2cell.html?searchHighlight=mat2cell&s_tid=doc_srchtitle