matlab用逻辑矩阵作为索引

今天学习matlab看到一个用法,甚是疑惑,代码如下:

Dx(isfinite(Gx),:)

isfinite(Gx)出来是一个二维逻辑矩阵,用逻辑矩阵作为索引是什么意思呢?

于是进行尝试:

首先随便创建一个逻辑矩阵

logic = isfinite([1,nan;1,1;1,1]);

logic =

  3×2 logical 数组

   1   0
   1   1
   1   1

创建一个二维随机矩阵

>> m = rand(4,4)

m =

    0.2967    0.0855    0.9289    0.2373
    0.3188    0.2625    0.7303    0.4588
    0.4242    0.8010    0.4886    0.9631
    0.5079    0.0292    0.5785    0.5468

试试结果

>> m(logic,:)
位置 1 处的逻辑索引包含一个在数组边界之外的 true 值。

竟然超出界限了,但按理说逻辑矩阵的维度是比随机矩阵的维度小的呀。

那么扩大随机矩阵维度试试

>> m = rand(6,6)

m =

    0.5211    0.3674    0.0987    0.1068    0.8909    0.5000
    0.2316    0.9880    0.2619    0.6538    0.3342    0.4799
    0.4889    0.0377    0.3354    0.4942    0.6987    0.9047
    0.6241    0.8852    0.6797    0.7791    0.1978    0.6099
    0.6791    0.9133    0.1366    0.7150    0.0305    0.6177
    0.3955    0.7962    0.7212    0.9037    0.7441    0.8594

>> m(logic,:)

ans =

    0.5211    0.3674    0.0987    0.1068    0.8909    0.5000
    0.2316    0.9880    0.2619    0.6538    0.3342    0.4799
    0.4889    0.0377    0.3354    0.4942    0.6987    0.9047
    0.6791    0.9133    0.1366    0.7150    0.0305    0.6177
    0.3955    0.7962    0.7212    0.9037    0.7441    0.8594

可以看到,少了一行,第4行无了。

那么就来思考,为什么逻辑矩阵

logic =

  3×2 logical 数组

   1   0
   1   1
   1   1

能使第四行消失呢?

>> logic(:)

ans =

  6×1 logical 数组

   1
   1
   1
   0
   1
   1

>> logic(4)

ans =

  logical

   0

可以看到,采用线性索引(按列索引)遍历逻辑矩阵,其第四个元素恰是逻辑0

看来用逻辑矩阵作为(行)索引,实则对逻辑矩阵进行线性索引,仅保留逻辑为1的行。

如果矩阵行数超出逻辑矩阵的线性索引,同样不会保留

>> m = rand(20,6);
>> m(logic,:)

ans =

    0.8055    0.7224    0.6569    0.4177    0.1564    0.5841
    0.5767    0.1499    0.6280    0.9831    0.8555    0.1078
    0.1829    0.6596    0.2920    0.3015    0.6448    0.9063
    0.8865    0.9730    0.0155    0.6663    0.1909    0.8178
    0.0287    0.6490    0.9841    0.5391    0.4283    0.2607

还是只有5行。

用逻辑索引作为列索引同理

>> m = rand(6,6)

m =

    0.0688    0.7184    0.7788    0.4401    0.6377    0.6951
    0.3196    0.9686    0.4235    0.5271    0.9577    0.0680
    0.5309    0.5313    0.0908    0.4574    0.2407    0.2548
    0.6544    0.3251    0.2665    0.8754    0.6761    0.2240
    0.4076    0.1056    0.1537    0.5181    0.2891    0.6678
    0.8200    0.6110    0.2810    0.9436    0.6718    0.8444

>> m(:, isfinite([1,1;nan,1]))

ans =

    0.0688    0.7788    0.4401
    0.3196    0.4235    0.5271
    0.5309    0.0908    0.4574
    0.6544    0.2665    0.8754
    0.4076    0.1537    0.5181
    0.8200    0.2810    0.9436

仅保留逻辑索引为1的第1,2,4列。

那如果将逻辑索引按照线性索引的方式来进行遍历呢?

>> logic = isfinite([1,nan;1,1]);
m = rand(4,4)
m(logic)

m =

    0.3804    0.5308    0.5688    0.1622
    0.5678    0.7792    0.4694    0.7943
    0.0759    0.9340    0.0119    0.3112
    0.0540    0.1299    0.3371    0.5285


ans =

    0.3804
    0.5678
    0.0540

可以看到,仅保留逻辑矩阵逻辑1位置的线性索引所对应的原矩阵的元素。并将结果输出为列向量。

因此还是那句话:

逻辑矩阵作为行(列)索引,实则对逻辑矩阵进行线性索引,仅保留逻辑为1位置的原矩阵的行(列)。

另外还有一种有趣的用法

利用逻辑矩阵作为索引可以将原矩阵的所有元素按列取出,仅保留矩阵中复合逻辑的元素,将最终结果输出为列向量

如希望取出矩阵m中所有有限的元素,可以用

m(isfinite(m))

结果会将m按列取出,去除其中为nan的元素,并最终排列为一个列向量。

猜你喜欢

转载自blog.csdn.net/Eason_Y/article/details/129289208