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谢谢您的回答。