这贡献的灵感来源于一个系列文章由布鲁诺陈德良和Jan西蒙。通常,我们希望将一个数组分成相同大小的子块,这些块上执行一个操作,减少他们标量。通用块业务,MATLAB像BLOCKPROC可用功能。通常也可以做这种处理数组使用MAT2CELL细分到细胞,每个包含一块,然后应用CELLFUN。
对于某些特定的操作和常见的种类,但是,它是可能的一种特别高效的计算方式。这些函数包括sum(),刺激(),(),max ()、min (),…可以做可分离地沿着每个维度的块,第一列,然后沿着行,等等……例如,
和(B) =总和(金额(金额(B, 1), 2), 3)
通过将这些函数分解为可分离的调用,可以做块数组中最小的数据复制和高度的向量化和连续的内存访问。的mfunction SEPBLOCKFUN在此提交优化可分离函数的计算以这种方式用户关心供应。
用法:
Y = sepblockfun (X, blockdims有趣)
:
X:一个完整的数组。如果ndSparse类定义的路径,那么X
也可以定期稀疏矩阵或者ndSparse数组。性能可能会
不像完整的阵列,然而。
blockdims:一个整数向量指定的尺寸
子块。数组X必须均匀分割成块
这个尺寸的。如果blockdims(我)被设置为正无穷
换成blockdims (i) = (X, i)大小。
乐趣:函数处理手术被认为是可分的
(例子:最大值、最小值、求和、刺激的意思是,等)。函数必须
接受输入语法有趣(B,暗),B是一个输入数组
和昏暗的运作是一个维度。另外,
乐趣可以下列字符串之一的‘麦克斯’,‘敏’,‘和’,‘说’,
“刺激”。
:
Y:输出数组。Y (i) =乐趣(ξ(:),1)习近平在第i个区块
输入数组X。
示例1:
把400 x400x400数组分成10 x10x10块。返回块,
意思是,马克斯。,每个块的分钟,每个组织为一个40 x40x40数组。
一个=兰德(400400400);
一= sepblockfun ([10、10、10], @mean);
阿明= sepblockfun([10、10、10],“最小值”);
Amaxs = sepblockfun ((10、10、10), @ (B, d) max (B, [], d));
示例2:
不是所有操作满足分离性的属性,但
有时不可分割的操作可以分解为可分离的。作为
一个例子,我们把块标准差相同的数组
从例1。
美国=√sepblockfun a ^ 2,(10、10、10)“的意思是”)- - -一。^ 2);
还可以使用SEPBLOCKFUN稀疏矩阵和数组如果你碰巧有我ndSparse类<//www.tatmou.com/matlabcentral/fileexchange/29832-n-dimensional-sparse-arrays >安装。然而,稀疏阵列可能受益从计算策略比完整的阵列,部分原因在于重塑稀疏矩阵的操作效率较低。也只是可能的应用可分离函数重载了ndSparse类。
引用作为
马特·J (2023)。可分离的基于块的操作(//www.tatmou.com/matlabcentral/fileexchange/48089-separable-block-wise-operations), MATLAB中央文件交换。检索。