0

我有例如这个矩阵

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];

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

谢谢。

4

3 回答 3

3

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

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);

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

于 2013-09-07T13:12:50.307 回答
1

这是一种解决方案:

% 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
于 2013-09-07T12:17:43.787 回答
1

比 Bas Swinckels 的回答稍微紧凑:

I=reshape(1:numel(A),size(A));
J=I(i2,i1);
J(~~B)
于 2013-09-07T12:36:02.157 回答