获取给定索引前后 (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] );
什么是最好的 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] );