我有一个尺寸为256 x 3527 x 8
的3D数组(图像)。我希望通过1到8的向量将所有值除以第3维。
例如,我的矢量看起来像:
Esun = [1 2 3 4 5 6 7 8]
在尺寸为256 x 3527
(8层)的图像的每一层中,我想将其除以Esun
中的相应值。
如果MATLAB没有这样的功能,将3D数组切割成8个并通过循环运行,或者将Esun转换成3D重复数组并进行矩阵划分会更快吗?
答案 0 :(得分:1)
请不要使用arrayfun
,因为它本质上是一个循环。使用强大的bsxfun
代替permute
:
Esun = 1:8; % Esun = [1 2 3 4 5 6 7 8];
B = bsxfun(@rdivide, A, permute(Esun, [1 3 2]));
变量A
是您拥有的大小为256 x 3527 x 8
的3D矩阵。对permute
的调用使用Esun
并将其转换为1行1列的3D矢量。之后,bsxfun
广播3D矢量,使其成为大小为256 x 3527 x 8
的3D矩阵,其中每个切片i
代表i
中的Esun
值。然后我们执行元素分割。
这基本上执行您所说的重复数组操作,但复制在bsxfun
内部完成,并且比您先创建重复数组然后执行除法更快。 / p>
答案 1 :(得分:0)
您可以使用以下arrayfun
:
c=arrayfun(@(i) X(:,:,i)*Esun(i),1:8,'UniformOutput',0);
假设X
是您的图像数组。在上面,MATLAB返回1x8单元阵列,然后您可以使用cat
函数来获取新数组:
B = cat(3, c{:}); % cat all cell elements in 3-rd dim