MATLAB:通过1D向量进行3D阵列划分

时间:2016-07-19 02:47:34

标签: image matlab vector vectorization

我有一个尺寸为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重复数组并进行矩阵划分会更快吗?

2 个答案:

答案 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