最近遇到一个问题,我需要把一个矩阵每行的最大值及其之后相邻的几个数值给提取出来,历经了几个阶段:一开始想着简单直接错误;后来为了准确逐行循环,但数据量有点大,这里使用线索引避免for循环:
%% 线索引来避免循环
A = rand(10,8);
% 扩充,避免最大值落于end处(实际数据是不会存在这个问题的)
A(:,end+1)=-1;
A(:,end+1)=-1;
[ma,im] = max(A,[],2);
% 方法一,错误:
D = A(:,im:im+2);
% 方法二,for循环,绝对正确
B = [];
[m,n]=size(A);
for i = 1:m
B(i,:)=A(i,im(i):im(i)+2);
end
% 方法三,线索引
C = [];
idx = sub2ind(size(A),1:m,im');C(:,1)=A(idx)';
idx = sub2ind(size(A),1:m,(im+1)');C(:,2)=A(idx)';
idx = sub2ind(size(A),1:m,(im+2)');C(:,3)=A(idx)';
% 检测
m_difb = max(max(abs(B-C)))
m_difd = max(max(abs(B-D)))
这里,B和C的结果是一致的。同时考虑,为什么方法一的结果不对?