【问题标题】:Best way to flatten a 2D matrix to 1D when sliced from a 3D matrix variable从 3D 矩阵变量切片时将 2D 矩阵展平为 1D 的最佳方法
【发布时间】:2015-10-14 08:50:37
【问题描述】:

我在 Matlab 中有一个 3D 矩阵来存储一系列 2D 数组。我必须找到最大值及其行和列索引,这对于保存二维数组的单个变量来说非常简单

A = rand(10,10);
[m,i] = max(A(:));
[I,J] = ind2sub( size(A) , i )

问题是我不能对 3D 矩阵使用这种语法

A = rand(10,10,3);
[m,i] = max( A(:,:,1)(:) );
[I,J] = ind2sub(size( A(:,:,1) ), i )

Error: ()-indexing must appear last in an index expression.

我可以创建一个临时变量来存储 2D 切片,但我想我会看看是否有更好的方法来执行此操作,也许调用重塑?在这种情况下,有什么方法可以使用简单的线性化/扁平化运算符(:)

【问题讨论】:

    标签: matlab matrix vectorization reshape


    【解决方案1】:

    这是我要做的:

    [B i]=max(reshape(A,[],size(A,3)));
    [II,JJ]=ind2sub(size(A),i );
    

    唯一的限制是它不能很好地处理每个 2D 切片超过一个最大值的情况。

    【讨论】:

    • reshape 和 ind2sub 的甜蜜使用!这里使用 ind2sub 的方式似乎有点“标签外”(但没有错)。更易读的版本可能是 [II,JJ]=ind2sub([size(A,1) size(A,2)],i);
    • 该死,看起来我不能使用那个展平运算符。可以使用 reshape 就好了。
    【解决方案2】:

    您可以将其转换为元胞数组并使用cellfun

    B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]);
    [M,I]= cellfun(@max,B)
    [R,C] = ind2sub(size(A),I);
    

    M 包含最大值,I 对应索引。


    假设A 是一个3x3x2 数组。

    A =[
    
        0.7952    0.4456    0.7547
        0.1869    0.6463    0.2760
        0.4898    0.7094    0.6797];
    
    A(:,:,2) =[
    
        0.6551    0.4984    0.5853
        0.1626    0.9597    0.2238
        0.1190    0.3404    0.7513];
    

    将每个切片转换为1x9x2 元胞数组

    B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]);
    
    B(:,:,1) = 
    
        [1x9 double]
    
    
    B(:,:,2) = 
    
        [1x9 double]
    

    取每个切片的最大值。 R 是行,CM 中相应最大值的列。

    [M,I]= cellfun(@max,B)
    [R,C] = ind2sub(size(A),I)
    
    R(:,:,1) =
    
         1
    
    R(:,:,2) =
    
         2
    
    C(:,:,1) =
    
         1
    
    C(:,:,2) =
    
         2
    

    【讨论】:

      【解决方案3】:

      连续取最大值会直接按(反)序拉出索引:

      A = rand(10,10,3);
      [m,J] = max(max(A(:,:,1)));
      [m,I] = max(A(:,J,1));
      

      %检查: A(I,J,1) == m

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 2015-01-24
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        相关资源
        最近更新 更多