最好的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矩阵展开,但是......
答案 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)]
并排显示索引和数据