【问题标题】:Select some entries of a matrix given an indexing matrix?在给定索引矩阵的情况下选择矩阵的一些条目?
【发布时间】:2016-08-17 21:38:10
【问题描述】:

我有两个矩阵,比如说A和我的索引矩阵I,其中它的值为1,我想取矩阵A的相同位置的值,它的值在哪里是0,我想在矩阵A的位置放一个0。

例如:

A=

1 2 3

4 5 6

7 8 9

I=

0 1 0

0 0 1

1 1 0

所以我想要的输出是:

0 2 0

0 0 6

7 8 0

我知道我可以使用两个 for 循环来做到这一点,但这不是很有效。有没有更好的办法?任何建议将不胜感激。

【问题讨论】:

标签: matlab matrix indexing


【解决方案1】:

如果I只有10,就写A.*I

ans =
     0     2     0
     0     0     6
     7     8     0

如果I 有一些其他数字,那么只保留A 中的元素,其中Ik 中的相同位置的一般情况是:

A = magic(3)
I = [1 2 3
    3 2 1
    2 1 3]
k = 1;
A.*(I==k)

还有输出:

A =
     8     1     6
     3     5     7
     4     9     2
I =
     1     2     3
     3     2     1
     2     1     3
ans =
     8     0     0
     0     0     7
     0     9     0

当然,这可以更改为 I>kI<=(k+5) 或您希望的任何其他逻辑语句。
这里的关键是(I==k) 产生一个逻辑输出:

ans =
     1     0     0
     0     0     1
     0     1     0

这让我们回到第一个案例。

【讨论】:

    【解决方案2】:

    您可以反转索引矩阵(如果它还不是二进制,这将隐式转换为二进制),并将这些索引处的值设置为零。

     A(~I) = 0
    

    优点是您实际上不需要定义新的或额外的矩阵,如果您的矩阵很大,这会很昂贵。

    【讨论】:

      【解决方案3】:

      正如所指出的,在您的情况下,最好的方法是简单的逐项乘法。在更复杂的情况下,您必须根据取决于索引矩阵的规则更改条目,您可以访问索引矩阵指向的条目。

      例如,如果你想加倍索引为一的条目并将零索引的条目设置为 -1,你应该这样做:

      A(I==1)=2*A(I==1);
      A(I==0)=-1;
      

      【讨论】:

        【解决方案4】:

        我非常喜欢@EBH 的回答,但这是使用logical 的另一种方法:

        B = zeros(size(A));
        log_I = logical(I);
        B(log_I) = A(log_I);
        B
        
        B =
        
             0     2     0
             0     0     6
             7     8     0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-19
          • 2016-02-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多