【问题标题】:MATLAB: 3D array division by 1D vectorMATLAB:3D 数组除以 1D 向量
【发布时间】:2016-11-21 18:33:36
【问题描述】:

我有一个尺寸为256 x 3527 x 8 的 3D 数组(图像)。我希望将所有值除以 3 维除以 1 到 8 的向量。

例如,我的向量看起来像:

Esun = [1 2 3 4 5 6 7 8]

在大小为256 x 3527(共8层)的图像的每一层中,我想将其除以Esun中的相应值。

如果MATLAB没有这样的功能,是把我的3D数组切成8块循环运行,还是把Esun变成3D重复数组做矩阵除法比较快?

【问题讨论】:

    标签: image matlab vector vectorization


    【解决方案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 表示 Esun 中的 ith 值。然后我们执行逐元素除法。

    这基本上执行了您所说的重复数组操作,但复制是在 bsxfun 内部完成的,并且比您先创建重复数组然后执行除法要快。

    【讨论】:

    • 我已经阅读了一些关于使用 bsxfun 的信息,我只有一个问题:我使用的显卡类型会影响它的速度吗?
    • 不,它没有。图形内存仅在使用gpuArrays 时在 MATLAB 中使用,并且仅支持 nVidia 卡。否则,影响性能的应该主要是 CPU 和 RAM。
    • 啊,好吧,我想我误读了 mathworks 页面上的定义。感谢您的澄清。
    • 没问题!实际上,您能指出我阅读的文档吗?我想亲眼看看。
    • 这里是:link。我想我在定义中找到了另一个没有“gpuArray”一词的 mathworks 页面。
    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多