我有例如这个矩阵
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];
那么,如何获得没有循环的索引?
感谢。
答案 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);
请注意,如果矩阵包含Inf
或NaN
值,则第一个单线程会失败,因为这些值将乘以零,第二种和第三种方法在这种意义上更加稳健。
答案 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)