Matlab,矩阵运算

时间:2013-09-07 11:20:27

标签: matlab matrix

我有例如这个矩阵

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

那么,如何获得没有循环的索引?

感谢。

3 个答案:

答案 0 :(得分: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);

请注意,如果矩阵包含InfNaN值,则第一个单线程会失败,因为这些值将乘以零,第二种和第三种方法在这种意义上更加稳健。

答案 1 :(得分: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

答案 2 :(得分:1)

比Bas Swinckels答案更紧凑:

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