图片缩略图

可分离的基于块的操作

version 1.3.0.2 (2.17 KB) by 马特·J
高效地执行数组子块上的可分离操作(例如,sum, mean,prod, min, max,…

1.1 k下载

更新2019年3月29日

查看许可协议

这篇文章的灵感来自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
也可以是正则稀疏矩阵或ndSparse数组。性能可能会
但不像完整数组那样强大。

块dim:一个整数向量,指定块的尺寸
子块。数组X必须均匀地划分为块
这个尺寸的。如果blockdims(i)被设置为Inf,那么它将是
换成blockdims (i) = (X, i)大小。

假设可分离的操作的函数句柄
(例子:最大值、最小值、求和、刺激的意思是,等)。函数必须
接受输入语法fun(B,DIM),其中B是一个输入数组
DIM是一个操作的维度。另外,
Fun可以是以下字符串之一'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') -平均值。^ 2);

它也可以使用SEPBLOCKFUN稀疏矩阵和数组,如果你碰巧有我的ndSparse类<//www.tianjin-qmedu.com/matlabcentral/fileexchange/29832-n-dimensional-sparse-arrays >安装。然而,稀疏数组从计算策略中获得的好处可能比完整数组少,部分原因是对于稀疏矩阵来说,重塑操作效率较低。另外,它只可能应用为ndSparse类重载的可分离函数。

引用作为

马特·J(2021)。可分离的基于块的操作(//www.tianjin-qmedu.com/matlabcentral/fileexchange/48089-separable-block-wise-operations), MATLAB中央文件交换。检索

MATLAB版本兼容性
创建R2013b
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!