获取给定索引前后 (window +/- 1) 的向量索引

Get vector indices before-and-after (window +/- 1) given indices

什么是最好的 Matlab/Octave 成语,给定 idx 一个索引向量,以获得 idx +/-1 的排序向量?

我有一个 n x 7 数据矩阵,第 3 列是一个整数标签,我想查看其上的不连续点邻域。 因此我得到了相应的索引:

idx = find(diff(data(:,3)) > 0)

5297
6275
6832
...
20187

然后,如果我想在我的列上查看该邻域 +/- 1(例如,在 (mx2) 矩阵 [idx-1; idx+1] 上),我需要形成 idx-1, idx+1 的向量,或者连接在-命令,或诉诸。 我发现了一些笨拙的方法,正确的方法是什么? (我尝试了所有 octave chapter on Rearranging Matrices

% WAY 1: this works, but is ugly - a needless O(n) sort
sort([idx-1; idx+1])

% horzcat,vertcat,vec only stack it vertically
horzcat([idx-1; idx+1])
horzcat([idx-1; idx+1]')

% WAY 2?
%One of vec([idx-1; idx+1]) or vec([idx-1; idx+1]') should work? but doesn't, they always stack columnwise
horzcat([idx-1; idx+1]')

ans =
Columns 1 through ...
5297    6275    6832 ...  20187    5299    6277    6834 ... 20189

% TRY 3...
reshape([idx-1; idx+1], [36,1]) doesn't work either

您会认为只有两种方法可以拆开 2xm 矩阵,但是...

嗯,我终于找到了这个八度矩阵操作:

vec([idx-1, idx+1]')
ans =

5297
5299
6275
6277
6832
6834
...
20187
20189

将 Wolfie 的解决方案改编成最短的 Octave-only 代码:

[idx-1, idx+1]' (:)  
( idx(:)' + [-1; 1] )(:) 

idx = ( find(diff(data(:,3)) > 0 )' + [-1; 1] )(:) 作为 one-liner

... 和 [idx , data(idx,3)] 显示索引和数据,side-by-side

您可以使用隐式单例扩展(R2016b 或更新的 MATLAB,Octave 原生)来做到这一点

idx = [2, 6, 9]; % some vector of integers
% Use reshape with [] to tell MATLAB "however many rows it takes"
neighbours = reshape( idx + [-1;1], [], 1 );

>> neighbours = [1; 3; 6; 8; 8; 10];

如果您不知道 idx 是行还是列,您可以使用

更加稳健
neighbours = reshape( idx(:)' + [-1,1], [], 1)

如果您不想使用隐式扩展(并再次处理行或列idx),您可以像这样使用重塑

neighbours = reshape( [idx(:)-1, idx(:)+1]', [], 1 )

注意:您可能还想将整个事情包装在对 unique 的调用中。在我的示例中,您两次获得索引 8,我不确定这在您的情况下是否可取。

但是,unique 执行排序(除非您使用 'stable' 标志,但这会使它变得更慢),所以如果您想删除重复项,您不妨使用您原来的方法:

% Remove duplicates and sort the result using unique 
neighbours = unique( [idx-1, idx+1] );