Extract diagonal element from each frontal slice of tensor

前端 未结 3 935
忘掉有多难
忘掉有多难 2021-01-19 10:55

I have a p-by-p-by-n tensor. I want to extract diagonal element for each p-by-p slice. Are there anyone know how to do this without looping?

Thank you.

3条回答
  •  余生分开走
    2021-01-19 11:50

    One suggestion I have is to create a p x p logical identity matrix, replicate this n times in the third dimension, and then use this matrix to access your tensor. Something like this, supposing that your tensor was stored in A:

    ind = repmat(logical(eye(p)), [1 1 n]);
    out = A(ind);
    

    Example use:

    >> p = 5; n = 3;
    >> A = reshape(1:75, p, p, n)
    
    A(:,:,1) =
    
         1     6    11    16    21
         2     7    12    17    22
         3     8    13    18    23
         4     9    14    19    24
         5    10    15    20    25
    
    
    A(:,:,2) =
    
        26    31    36    41    46
        27    32    37    42    47
        28    33    38    43    48
        29    34    39    44    49
        30    35    40    45    50
    
    
    A(:,:,3) =
    
        51    56    61    66    71
        52    57    62    67    72
        53    58    63    68    73
        54    59    64    69    74
        55    60    65    70    75
    
    >> ind = repmat(logical(eye(p)), [1 1 n]);
    >> out = A(ind)
    
    out =
    
         1
         7
        13
        19
        25
        26
        32
        38
        44
        50
        51
        57
        63
        69
        75
    

    You'll notice that we grab the diagonals of the first slice, followed by the diagonals of the second slice, etc. up until the last slice. These values are all concatenated into a single vector.

提交回复
热议问题