2013-03-11 76 views
0

這可能很簡單,但這是我的問題。MATLAB:從一個起點向量和一個終點向量開始,使這些點之間的連續數字運行

我有兩個向量,開始和結束。起點是連續數字序列的起點,終點是連續數字序列的終點。我想創建一個包含這些運行的向量。

因此,例如,說

starts = [2 7 10 18 24] 
ends = [5 8 15 20 30] 

我想創建以下矢量

ans = [2 3 4 5 7 8 10 11 12 13 14 15 18 19 20 24 25 26 27 28 29 30] 

使用啓動:最終只使用每個向量


的第一要素我也想在不使用(for)循環的情況下做到這一點,以儘可能快地保持它!

感謝您閱讀

克里斯

回答

2

假設總是有相同數量的起點和終點,它們總是匹配(例如,第n個開始對應於第n結束),那麼你可以做

cell2mat(arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false)) 

對於位更詳細的解釋,所述arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false)部分將生成n個單元陣列的一個序列,其中n是startsends向量的長度,使得每個小區AR ray具有對應於兩個向量的第i個元素的序列starts(i):ends(i)。然後cell2mat函數將每個單獨的單元陣列融合成一個更大的矩陣。

+0

那太好了!謝謝:) – 2013-03-11 23:48:01

+0

但它實際上比'for'循環更快嗎? – 2013-03-11 23:48:38

+1

是的,看起來這很快,至少對於顯示的問題大小。 – 2013-03-11 23:56:37

0

當你擔心使之快,預分配:

starts = [2 7 10 18 24] 
ends = [5 8 15 20 30] 
a = zeros(1,sum(ends)+numel(ends)-sum(starts)); 
% or a = zeros(1,sum(ends+1-starts)) 
j = 1; 
for i = 1:numel(ends) 
    j2 = j+ends(i)-starts(i); 
    a(j:j2) = (starts(i):ends(i)); 
    j = j2+1; 
end 
相關問題