0

これはおそらく簡単ですが、ここに私の問題があります。

開始と終了の2つのベクトルがあります。開始点は連続番号のシーケンスの開始点であり、終了点は連続番号のシーケンスの終了点です。これらの実行を含むベクトルを作成したいと思います。

たとえば、

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]

start:endを使用すると、各ベクトルの最初の要素のみが使用されます


また、可能な限り高速に保つために、(for)ループを使用せずにこれを実行したいと思います。

読んでくれてありがとう

クリス

4

2 に答える 2

2

開始点と終了点の数が常に同じであり、それらが常に一致していると仮定すると(たとえば、n番目の開始点がn番目の終了点に対応する)、次のことができます。

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

もう少し詳細に説明すると、arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false)パーツはn個のセル配列のシーケンスを生成します。ここでnは、startsおよびendsベクトルの長さであり、各セル配列はstarts(i):ends(i)2つのベクトルのi番目の要素に対応するシーケンスを持ちます。次に、cell2mat関数は個々のセル配列のそれぞれを1つの大きなマトリックスに融合します。

于 2013-03-11T23:30:23.453 に答える
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
于 2013-03-11T23:52:31.830 に答える