【问题标题】:Matlab , matrix operations矩阵运算
【发布时间】:2013-09-07 11:20:26
【问题描述】:

例如我有这个矩阵

A=[ 
  11  15   19   13
  12  16   0    114
  13  17   111  115
  14  18   112  116
  ];

我想找到两个索引矩阵的非零元素:

i1=[1 3];
i2=[2 4];

结果:

B=A(i2,i1);
B=[12  0
   14 112];

A 中矩阵的索引。

 index=[2 4 12];

那么,如何在没有循环的情况下获取索引?

谢谢。

【问题讨论】:

  • 你如何定义这些索引?为什么缺少索引 10?
  • @amadeus 谢谢。我编辑帖子。
  • 你需要做B = A(i2,i1)来得到你显示的矩阵,第一个索引是行,第二个是列。
  • @BasSwinckels 谢谢。是的,我编辑了帖子。

标签: matlab matrix


【解决方案1】:

当然有一个不太可读的单行:

index = find(diag(ismember(1:size(A,1), i2))*A*diag(ismember(1:size(A,2), i1)));

或者

index=find(sparse(i2,i2,1,size(A,1),size(A,1))*A*sparse(i1,i1,1,size(A,2),size(A,2)));

还有更详细和可读的:

z=zeros(size(A));
z(i2,i1) = A(i2,i1);
index=find(z);

请注意,如果矩阵包含 InfNaN 值,则第一个单行将失败,因为这些值将乘以零,从这个意义上说,第二种和第三种方法更健壮。

【讨论】:

    【解决方案2】:

    这是一种解决方案:

    % sub2ind does not work, use this hack instead
    z = zeros(size(A));
    z(i2,i1) = 1
    ind = find(z) % get linear indices
    
    %only keep the ones for which A is nonzero
    ind = ind(A(ind) ~= 0)
    

    结果:

    z =
         0     0     0     0
         1     0     1     0
         0     0     0     0
         1     0     1     0
    
    ind =
         2
         4
        10
        12
    
    ind =
         2
         4
        12
    

    【讨论】:

    • 最后一行应该是 ind = ind(~~A(ind))
    • 谢谢,我改成~=0
    • @BasSwinckels 感谢您的回答。
    【解决方案3】:

    比 Bas Swinckels 的回答稍微紧凑:

    I=reshape(1:numel(A),size(A));
    J=I(i2,i1);
    J(~~B)
    

    【讨论】:

    • 最后一行应该是J(~~A(J)),否则需要另外一行定义B
    • @amadeus 感谢您的回答。
    猜你喜欢
    • 2016-03-31
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多