2013-01-15 10 views
15

私は2つのベクトルidx1idx2を持っています。それらの間の値を取得したいと思います。 idx1idx2は数字ではなくベクトルた場合、私は次のようにそれを行うことができます: MATLABの2つのベクトル間のコロン(:) - の値をベクトル化する

idx1=1; 
idx2=5; 
values=idx1:idx2 

% Result 
% values = 
% 
% 1  2  3  4  5 

しかし、私の場合は

idx1idx2は、可変長のベクトルです。たとえば、長さ= 2の場合:

idx1=[5,9]; 
idx2=[9 11]; 

間に値を直接取得するためにコロン演算子を使用できますか?これは、次のようなものです:

values = [5  6  7  8  9  9 10 11] 

私はidx1(1):idx2(1)idx1(2):idx2(2)を行うことができます知っている、これは、個別に各列の値を抽出しているので、他の解決策がない場合、私はこれを行うことができますfor-loopを使用することができますが、Matlabはこれをより簡単に行うことができます。

+0

MATLABでは 'values'を使用できません。 3ベクトルで垂直連結された5ベクトル? – petrichor

+0

はい、あなたは正しいです、申し訳ありません。私はそれを修正するつもりです。値がすべて同じ行にあるかどうかは関係ありません。インデックス間にすべての値が必要なだけです。 – Digna

+0

MathworksのLorenによるこのトピックに関する優れたブログ記事があります:[コロン(:)の概念のベクトル化](http://blogs.mathworks.com/loren/2008/10/13/vectorizing-the-notion- of-colon) – knedlsepp

答えて

11

サンプル出力は有効ではありません。行列は異なる長さの行を持つことはできません。

values = arrayfun(@colon, idx1, idx2, 'Uniform', false) 

ベクターに得られた細胞の配列を変換するには、あなたがcell2matを使用することができます:また

values = cell2mat(values); 

、得られた細胞内のすべてのベクトルならば何ができることはarrayfunを使用してセル配列を作成することです配列の長さが同じ場合は、次のように出力行列を構成できます。

values = vertcat(values{:}); 
+1

ありがとう、それは役立ちます。値が必要なだけで、どの行を取得しても構わないので、 'values = unique(horzcat(values {:}));' I arrayfunの詳細を読むつもりですが、非常に便利です。 – Digna

+2

@Dignaかなり見えるかもしれませんが、悪用しないでください。 'for'ループと比較するとかなり遅いです(ベクトル化された解決策が存在する場合はさらに多くなります)ので、通常は後者を優先すべきです(速度が問題でなければ)...' [horacat(blah blah)]の代わりに[blah blah] 'を使用します。 –

0

セットの和集合をとってみてください。あなたが供給idx1の値とidx2を考えると、必要に応じて、値[5 6 7 8 9 10 11]とベクトルが得られます

values = union(idx1(1):idx1(2), idx2(1):idx2(2)); 

を実行します。

+0

お返事ありがとうございます。問題は、 'idx1'と' idx2'は長さがあることです(処理している信号に依存します)。この場合、この解決法は難しいでしょうか? (たぶん私は何かが足りない):) – Digna

+0

ああ、うそつき。申し訳ありませんが、私はその質問を誤解しました。 'arrayfun'を使ってデカルト積を取ることは、ここに行く方法のようです。 – benjwadams

0

私は@ Eitanのソリューションを動作させることができませんでした。明らかに、コロンにパラメータを指定する必要があります。 step = 1が実際にcolonのデフォルト値であり、かつUniformUniformOutputの代わりに使用することができますが、私は酒のためにこれらが含まれていることを

step = 1; 
idx1 = [5, 9]; 
idx2 = [9, 11]; 
values = arrayfun(@(x,y)colon(x, step, y), idx1, idx2, 'UniformOutput', false); 
values=vertcat(cell2mat(values)); 

注:以下の小さな変更は、それが私のR2010bのバージョンに取り組んでいました完全性の

0

ローレンVectorizing the Notion of Colon (:)といい投稿があります。これは、約5倍の速さ(大きなアレイの場合)またはarrayfunfor - ループを使用するよりもあり、レングス復号化を実行するために類似している答えを含む:

アイデアはコロンが出配列拡張することです。 各シーケンスの長さを知っているので、出力配列の開始点を知っています。 に開始値の後の値を1で埋めます。次に、あるシーケンスの終わりから次のシーケンスの始まりにジャンプするためにどれくらい を見つけます。 開始値が繰り返されると、ジャンプがマイナスになることがあります。 この配列が一度満たされると、出力は単純に累積合計またはシーケンスの累計である です。

function x = coloncatrld(start, stop) 
% COLONCAT Concatenate colon expressions 
% X = COLONCAT(START,STOP) returns a vector containing the values 
% [START(1):STOP(1) START(2):STOP(2) START(END):STOP(END)]. 

% Based on Peter Acklam's code for run length decoding. 
len = stop - start + 1; 

% keep only sequences whose length is positive 
pos = len > 0; 
start = start(pos); 
stop = stop(pos); 
len = len(pos); 
if isempty(len) 
    x = []; 
    return; 
end 

% expand out the colon expressions 
endlocs = cumsum(len); 
incr = ones(1, endlocs(end)); 
jumps = start(2:end) - stop(1:end-1); 
incr(endlocs(1:end-1)+1) = jumps; 
incr(1) = start(1); 
x = cumsum(incr); 
関連する問題