Matlab 矩阵运算
例如,我有一个矩阵Matlab 矩阵运算,matlab,matrix,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]; 那么,如何获得没有循环的索引呢 谢谢 这是一种解决方案: % sub2ind does not
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];
那么,如何获得没有循环的索引呢
谢谢 这是一种解决方案:
% 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
这是一个解决方案:
% 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
比Bas Swinckels稍微紧凑一点回答:
I=reshape(1:numel(A),size(A));
J=I(i2,i1);
J(~~B)
比Bas Swinckels稍微紧凑一点回答:
I=reshape(1:numel(A),size(A));
J=I(i2,i1);
J(~~B)
当然,有一行是不太可读的:
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
值,则第一个一行将失败,因为这些值将乘以零,因此第二个和第三个方法在这方面更稳健 当然,有一行是不太可读的:
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
值,则第一个一行将失败,因为这些值将乘以零,因此第二个和第三个方法在这方面更稳健 你如何定义这些指数?为什么索引10丢失了?@amadeus谢谢。我编辑了这篇文章。你需要做B=A(i2,i1)
才能得到你显示的矩阵,第一个索引是行,第二个是列。@BasSwinckels谢谢。是的,我编辑了这篇文章。你如何定义这些索引?为什么索引10丢失了?@amadeus谢谢。我编辑了这篇文章。你需要做B=A(i2,i1)
才能得到你显示的矩阵,第一个索引是行,第二个是列。@BasSwinckels谢谢。是的,我编辑了这篇文章。最后一行应该是ind=ind(~~A(ind))谢谢,我把它改成了~=0
@BasSwinckels谢谢你的回答。最后一行应该是ind=ind(~~A(ind))谢谢,我把它改成了~=0
@BasSwinckels谢谢你的回答。最后一行应该是J(~~A(J))
,否则您需要另一行定义B
@amadeus谢谢您的回答。最后一行可能应该是J(~~A(J))
,否则您需要另一行定义B
@amadeus谢谢您的回答。