相关文章推荐
独立的胡萝卜  ·  matlab ...·  2 周前    · 
豁达的马克杯  ·  MySQL 8.0.16 ...·  1 年前    · 
怕老婆的回锅肉  ·  Android 27+ ...·  1 年前    · 

我写这篇文章的目的就是为了能够将大矩阵简单的分为若干块,例如500x500的矩阵,分成100x100个5x5的分块矩阵。文档上只写了通过 dim1Dist = [5,5,5,...,5,5] 对矩阵进行划分,但是我们不能直接写100个5,那样太麻烦了,我们这里有一个小技巧能够简单的进行划分。

mat2cell函数

我们先介绍一下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

Matlab小技巧—mat2cell对大矩阵分成若干块目的mat2cell函数目的我写这篇文章的目的就是为了能够将大矩阵简单的分为若干块,例如500x500的矩阵,分成100x100个5x5的分块矩阵。文档上只写了通过dim1Dist = [5,5,5,...,5,5]对矩阵进行划分,但是我们不能直接写100个5,那样太麻烦了,我们这里有一个小技巧能够简单的进行划分。mat2cell函数我...
MAT2TILES 基本上是 mat2cell 的包装器,但当您只是尝试将 N 维数组分解为相等大小的块时,它具有更方便的接口。 它将所需的块大小作为输入参数,而 mat2cell 则不然。 当您只想沿特定尺寸平铺时,MAT2TILES还提供了一些便捷的快捷方式(请参见下文)。 用法: C=mat2tiles(X,D1,D2,D3,...,Dn) C=mat2tiles(X,[D1,D2,D3,...,Dn]) 将生成一个包含数组 X 的相邻块的元胞数组 C,每个块的维度为 D1xD2xD3x...xDn。 如果维度 Di 没有均匀划分为 size(X,i),则沿维度 i 的 X 上边界的块将被截断。 允许为 Di 赋予值 Inf。 这样做后,就相当于设置了 Di=size(X,i)。 如果您只想沿某些数组维度进行平铺,这将非常有用。 示例1:将一个28x28矩阵拆分为4x7子矩阵>> A
https://blog.csdn.net/qq_43080446/article/details/103779227 https://blog.csdn.net/weixin_43852752/article/details/104194720 https://www.jianshu.com/p/ca38837dc74d?utm_campaign=haruki
遇到了将一个矩阵分为几个子矩阵并分别对子矩阵进行操作的问题,经网上搜索测试,学习使用mat2cell及相应的cellfun,下面是一些个人的理解。 先说mat2cell函数,从函数名可以看出,这个函数的作用就是将矩阵分为几个子矩阵,也就是所谓的胞元(cell)。为了说清楚这个函数的作用,先引入数学中的一个概念叫做笛卡儿积,具体概念示例如下图: 在mat2cell函数中,有三个参数,第一
B = blockproc(A,[m n],fun) B = blockproc(src_filename,[m n],fun) B = blockproc(adapter,[m n],fun) blockproc(___,Name,Value) A是要处理的图像矩阵,如果图像太大不能完全导入内存,也可以用图像文件名src_filename来表示。[M...
元胞数组是一种包含名为元胞的索引数据容器的数据类型,其中的每个元胞都可以包含任意类型的数据。元胞数组通常包含文本列表、文本和数字的组合或者不同大小的数值数组。 1、我们可以使用元胞数组构造运算符 {} 创建该数组,例如: % 使用元胞数组构造运算符{}创建数组 C = {1,2,3; 'text',rand(5,10,2),{11; 22; 33}} C = 2x3 c... 比如说 我有一个矩阵是3*731的,想把它的每一行拆出来 可以这样: aaa = mat2cell(sv_t,[1 1 1],[731]); [sv_t1 sv_t2 sv_t3] = deal(aaa{:}); 运行结果如下,其中aaa是一个3行1列... 1)分割,首先将图像分割成8x8或16x16的小块; 2)DCT变换,对每个小块进行DCT变换; 3)舍弃高频系数(AC系数),保留低频信息(DC系数)。高频系数一般保存的是图像的边界、纹理信息,低频信息主要是保存的图像中平坦区域信息。 4)图像的低频和高频,高频区域指的是空域图像中突变程度大的区域(比如目...