图像缩略图

可分离的块明智的操作

版本1.3.0.2(2.17 kB) 马特J.
有效地执行阵列子块上的可分离操作(例如,总和,均值,pin,max,...)

1.1K下载

更新2019年3月29日

查看许可证

这笔贡献是由Bruno Luong和Jan Simon的一系列帖子的启发。通常,我们希望将数组分成相等大小的子块并对这些块进行操作,将它们减少到标量。对于常规块操作,MATLAB已像BlockProc这样的可用功能。通常还可以通过使用MAT2Cell将数组细分为单元格,每个都包含块,然后应用Cellfun来执行这种处理。
然而,对于某些特定的和常见的操作类型,可以以一种特别有效的方式进行计算。这些函数包括sum(), prod(), mean(), max(), min(),…这可以沿着块的每个维度分别进行,首先沿着列,然后沿着行,等等……例如,

总和(b)= sum(sum(sum(b,1),2),3)

通过将这些函数分解为可分离的调用,可以在一个数组中以最小的数据复制和高度的向量化和顺序内存访问的方式按块执行它们。本次提交中的mfunction SEPBLOCKFUN以这种方式优化了用户关心提供的任何可分离函数的计算。

用法:

y = sepblockfun(x,blockdims,乐趣)

:


x:一个完整​​的阵列。如果NDSPARSE类隐形在路径上,则x
也可以是常规稀疏矩阵或ndsparse数组。表现可能
然而,不如完整数组那么强大。

blockdims:整数的矢量指定尺寸的整数
子块。阵列x必须均匀分隔成块
这个尺寸。如果blockdims(i)设置为inf,那么它将是
替换为blockdims(i)= size(x,i)。

假设可分离的操作的函数句柄
(示例:MAX,MIN,SUM,PRISP,INCL等)。功能必须
接受输入语法的乐趣(b,dim),其中b是输入数组
暗淡是操作的尺寸。或者,
乐趣可以是以下字符串'max','min','sum','意思',
“刺激”。


出去:

y:输出阵列。y(i)=有趣(xi(:),1)xi是第i个子块
输入数组X。


例1:

将400x400x400数组划分为10x10x10块。返回块,
意思是,马克斯。,以及每个块的最小值,每个块被组织成一个40x40x40的数组。

a = rand(400,400,400);
Ameans = Sepblockfun(A,[10,10,10],@均值);
Amins = sepblockfun(a,[10,10,10],'min');
Amaxs = Sepblockfun(A,[10,10,10],@(b,d)max(b,[],d));

例2:

不是所有的运算都满足可分性,但是
有时不可分离的操作可以分解成可分离的操作。作为
一个例子,我们采取相同数组的块标准偏差
从实施例1开始。

astds = sqrt(sepblockfun(o. ^ 2,[10,10,10],'平均') - ameans。^ 2);

如果您碰巧有我的ndsparse类<,也可以使用sepblockfun进行稀疏矩阵和数组<//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创建
与任何版本兼容
平台兼容性
窗户 苹果系统 Linux.

社区宝藏狩猎

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!