sub2ind多维-元素访问

时间:2019-08-26 17:15:46

标签: arrays matlab

我有一个三维维度,例如u。我还有另一个3维矩阵,例如B。假设uB的尺寸为CxTxW。对于u的每个元素,我希望执行以下操作: 如果u> 0,则同时报告u的值以及它所在的相应T维度以及B/u的相应元素。如果u为0,则用正值T和{{1}来报告下一个C(对于相同的Wu) }和相应的T元素。在下面的代码中,我将B/u称为B/u

以下链接的问题以非常有效的方式回答了C = 1(即二维)的问题。我可以在c周围编写一个for循环,并为C的每个元素重复链接的答案,但我希望在没有for循环的情况下执行。

Vectorizable FIND function with if statement MATLAB

以下是带有循环的解决方案:

benefit

没有for循环怎么办?

1 个答案:

答案 0 :(得分:0)

您可以将整个对象置换为T x W矩阵,而不必将一行重塑为T x CW矩阵:

>> C = 4; T = 5; W = 3;
>> u = reshape(1:C*T*W, C, T, W)   % generate sample u
u =

ans(:,:,1) =

    1    5    9   13   17
    2    6   10   14   18
    3    7   11   15   19
    4    8   12   16   20

ans(:,:,2) =

   21   25   29   33   37
   22   26   30   34   38
   23   27   31   35   39
   24   28   32   36   40

ans(:,:,3) =

   41   45   49   53   57
   42   46   50   54   58
   43   47   51   55   59
   44   48   52   56   60

>> du = reshape(permute(u, [2 1 3]), T, [])
du =

    1    2    3    4   21   22   23   24   41   42   43   44
    5    6    7    8   25   26   27   28   45   46   47   48
    9   10   11   12   29   30   31   32   49   50   51   52
   13   14   15   16   33   34   35   36   53   54   55   56
   17   18   19   20   37   38   39   40   57   58   59   60

您在du上的其余代码应保持不变(添加虚拟行除外)。

倒数是:

>> permute(reshape(du, T, C, W), [2 1 3])
ans =

ans(:,:,1) =

    1    5    9   13   17
    2    6   10   14   18
    3    7   11   15   19
    4    8   12   16   20

ans(:,:,2) =

   21   25   29   33   37
   22   26   30   34   38
   23   27   31   35   39
   24   28   32   36   40

ans(:,:,3) =

   41   45   49   53   57
   42   46   50   54   58
   43   47   51   55   59
   44   48   52   56   60

我不知道这种解决方案是否真的更快。