【问题标题】:Applying a function at every matrix in an array of matrices (MATLAB)在矩阵数组中的每个矩阵上应用一个函数(MATLAB)
【发布时间】:2020-05-05 11:05:32
【问题描述】:

在 MATLAB 中,我有一个矩阵 (3x3) 数组 (512x512x512)。也就是说,我有一个大小为 (512x512x512x3x3) 的数组,其中 3x3 矩阵作为元素。我想在数组的每个元素处取矩阵求逆。有没有办法在不遍历三个维度的情况下做到这一点?例如,执行此操作的“蛮力”方法将是以下伪代码:

CoB_inv_size = size(CoB);
CoB_inv = zeros(CoB_inv_size); % array of size (512x512x512x3x3)

for i = 1:CoB_inv_size(1) % 512
    for j = 1:CoB_inv_size(2) % 512
        for k = 1:CoB_inv_size(3) % 512

            CoB_inv(i,j,k,:,:) = inv(CoB(i,j,k,:,:));

        end
    end
end

上面的数组CoB 是一个基变化矩阵数组(其中列是特征向量)。我需要这些矩阵的逆矩阵,它们将与另一个对角矩阵一起使用,以使用M=SDS^(-1) 在原始基础上获得矩阵数组。 SS^(-1) 分别由 CoBCoB_inv 表示。有没有办法在 MATLAB 中更快或更有效地执行上述操作?

【问题讨论】:

  • 不,(简短回答)。 arrayfun 函数将函数应用于矩阵/数组的每个元素。虽然,您可以使用解决方法并创建一个存储 3x3 矩阵的单元格数组,然后使用 cellfun-function 和 cellfun(@inv,YourCellArray)

标签: arrays matlab matrix


【解决方案1】:

在行尾使用; 而不打印结果将显着加快代码速度。除此之外,我认为没有太大的改进空间。向量化将依赖于应用于多个元素的相同操作,但不能对所有矩阵使用完全相同的步骤来反转矩阵。例如,如果您使用高斯,则有时必须交换行。

【讨论】:

    【解决方案2】:

    编辑:我的以下答案一般适用,但您声明您的矩阵是特征向量的集合。这意味着矩阵是正交的,因此转置是逆矩阵。在这种情况下,您只需使用permute 转置矩阵并获得所有矩阵的逆矩阵,即类似

    CoBinv = permute(CoB,[1,2,3,5,4]);
    

    原答案:如果您的计算机中有 GPU,则可以使用 pagefun。基本用法是两个维度指定矩阵,然后循环遍历其余维度,

    A = rand(3,3,512,512,512,'gpuArray');
    B = pagefun(@inv,A);
    s = size(B) % 3 x 3 x 512 x 512 x 512
    

    因此,您将不得不使用permute 来切换在前两个维度而不是最后两个维度中排列 3x3 矩阵的维度,使用 pagefun 然后切换回来。

    CoBtmp = permute(CoB,[4,5,1,2,3]);
    CoBinv = pagefun(@inv,CoBtmp);
    CoBinv = permute(CoBinv,[3,4,5,1,2]);
    

    免责声明:我目前工作的笔记本电脑中没有 GPU,因此我没有测试上述内容。

    【讨论】:

    • 一般来说,您建议的顺序 (3x3x...) 对于 OP 中的代码也更有效。
    • 为什么订单 (3x3x512x512x512) 比我当前的订单 (512x512x512x3x3) 更有效率? MATLAB中的一般图像不是通常被视为(WidthxHeightxChannels)吗?
    • @ShakthiVisagan 他们在记忆中彼此靠近
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多