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

时间:2018-02-20 09:25:29

标签: matlab vector find octave 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矩阵展开,但是......

2 个答案:

答案 0 :(得分:1)

您可以使用隐式单例扩展(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'标志,但这可能会使其更慢),因此如果您想删除重复项,也可以使用原始方法:< / p>

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

答案 1 :(得分:0)

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

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

5297
5299
6275
6277
6832
6834
...
20187
20189

将Wolfie的解决方案改编为最短的Octave代码:

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

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

... [idx , data(idx,3)]并排显示索引和数据