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的元素,并最终排列为一个列向量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值