考虑以下函数,它将灰度图像(2D矩阵)作为输入:
function r = fun1(img)
r = sum(sum(img));
我正在考虑使用arrayfun
来处理一系列图像(3d矩阵),从而无需使用for
循环:
arrayfun(@fun1, imgStack);
但是arrayfun
尝试将imgStack
的每个元素视为fun1
的输入,之前操作的结果也是3D矩阵。如何让arrayfun
知道我只想在fun1
的第三维上重复imgStack
?
另一个问题是arrayfun
并行调用fun1
吗?
答案 0 :(得分:5)
在这种情况下,您不需要arrayfun来执行计算,您只需执行此操作:
imgStack = rand( 10, 10, 4 ); % 4 10x10 images
r = sum( sum( imgStack, 1 ), 2 ); % sum along both dimensions 1 and 2
一般来说,许多MATLAB操作会同时对整个数组进行操作,这是避免循环的常用方法。
MATLAB的正常“arrayfun”不是平行的。但是,对于GPUArrays(使用Parallel Computing Toolbox),存在arrayfun的并行版本。
答案 1 :(得分:0)
关于你的第一个问题: 你可能会尝试accumarray。一个建议
function ds = applyfun_onfirstdim(arr, h_fun)
dimvec = size(arr);
indexarr = repmat( (1:dimvec(1))', [1, dimvec(2:end)] );
ds = accumarray(indexarr(:), arr(:), [], h_fun);
这将创建一个与输入" arr"相同尺寸的辅助索引数组。要应用h_fun的每个切片都获得相同的索引号。在这个例子中,它是第一个。