这篇文章的灵感来自Bruno Luong和Jan Simon的一系列文章。通常,我们希望将数组划分为大小相等的子块,并对这些块执行操作,将它们缩减为标量。对于一般的块操作,MATLAB提供了像BLOCKPROC这样的函数。通常也可以通过使用MAT2CELL将数组细分为单元格(每个单元格包含一个块),然后应用CELLFUN来完成这种处理。
然而,对于某些特定的和常见的操作,可以以一种特别有效的方式进行计算。这些函数包括sum(), prod(), mean(), max(), min(),…可以沿着块的每个维度进行分离,先沿着列,然后沿着行,等等……例如,
和(B) =总和(金额(金额(B, 1), 2), 3)
通过将这些函数分解为可分离的调用,就可以在一个数组中以最少的数据复制和高度向量化和顺序内存访问来块块地执行它们。在这个提交的mfunction SEPBLOCKFUN优化计算以这种方式为任何可分离的功能,用户关心提供。
用法:
Y = sepblockfun (X, blockdims有趣)
:
X:一个完整的数组。如果ndSparse类定义在路径上,则X
也可以是正则稀疏矩阵或非稀疏数组。性能可能会
但是,它没有完整数组那么强。
的维数的整数向量
子块。数组X必须均匀地划分成块
这个尺寸的。如果blockdims(i)被设置为Inf,那么它将是
换成blockdims (i) = (X, i)大小。
乐趣:函数句柄的一个操作假定是可分离的
(例子:最大值、最小值、求和、刺激的意思是,等)。函数必须
接受输入语法fun(B,DIM),其中B是一个输入数组
而DIM是一个可以操作的维度。另外,
乐趣可以是以下字符串中的一个'max','min','sum','mean',
“刺激”。
:
Y:输出数组。Y(i)=fun(Xi(:),1)其中Xi是的第i个子块
输入数组X。
示例1:
将400x400x400数组划分为10x10x10块。返回块,
意思是,马克斯。和每个块的最小值,每个块组织为一个40x40x40数组。
一个=兰德(400400400);
一= sepblockfun ([10、10、10], @mean);
阿明= sepblockfun([10、10、10],“最小值”);
Amaxs = sepblockfun ((10、10、10), @ (B, d) max (B, [], d));
示例2:
不是所有的操作都满足可分性,但是
有时不可分的运算可以分解成可分的运算。作为
以同一数组的块标准差为例
从例1。
Astds=sqrt(sepblockfun(A.^2,[10,10,10],'mean') - Ameans。^ 2);
如果你碰巧有我的ndSparse类<//www.tatmou.com/matlabcentral/fileexchange/29832-n-dimensional-sparse-arrays>安装。然而,稀疏数组从计算策略中得到的好处可能比完整数组少,部分原因是稀疏矩阵的整形操作效率较低。此外,只有在ndSparse类中重载的可分离函数才有可能被应用。
马特·J (2020)。可分离的基于块的操作(//www.tatmou.com/matlabcentral/fileexchange/48089-可分块智慧操作),MATLAB中央文件交换。检索。
1.3.0.2版本 | 没有变化 |
|
1.3.0.1 | 没有变化 |
|
1.3.0.0 | 只编辑描述。 |
|
1.3.0.0 | * |
|
1.3.0.0 | *处理长度(blockdims) |
|
1.2.0.0 | 小编辑 |
|
1.1.0.0 | 描述部分的小编辑 |
布鲁诺·斯特拉诺(查看配置文件)
从朱(查看配置文件)
madhan拉维(查看配置文件)
汤米·卡普兰(查看配置文件)
马特·J(查看配置文件)
谢谢,安东!
安东Semechko(查看配置文件)
“sepblockfun”的速度之快给我留下了深刻的印象。当处理图像时,这是一个非常有用的函数。