15

と の 2 つのベクトルがidx1ありidx2、それらの間の値を取得したいと考えています。idx1とがベクトルではなく数値である場合idx2、次の方法でそれを行うことができます。

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 ループを使用してこれを行うことができますが、Matlab でこれをより簡単に行うことができます。

4

4 に答える 4

11

サンプル出力は合法ではありません。行列には、異なる長さの行を含めることはできません。できることは、次を使用してセル配列を作成することですarrayfun

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

結果の cell 配列をベクトルに変換するには、次を使用できますcell2mat

values = cell2mat(values);

または、結果の cell 配列内のすべてのベクトルが同じ長さである場合、次のように出力行列を作成できます。

values = vertcat(values{:});
于 2013-01-15T16:11:37.740 に答える
0

セットの結合をとってみてください。指定した と の値idx1idx2指定して、実行します。

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

必要に応じて、値を持つベクトルが生成[5 6 7 8 9 10 11]されます。

于 2013-01-15T16:34:17.787 に答える
0

コロン (:) の概念のベクトル化と呼ばれるLorenによる素晴らしいブログ投稿があります。これには、または-loopを使用するよりも (大きな配列の場合) 約 5 倍高速で、run-length-decoding に似た回答が含まれています。arrayfunfor

アイデアは、コロン シーケンスを拡張することです。各シーケンスの長さがわかっているので、出力配列の開始点がわかります。開始値の後の値を 1 で埋めます。次に、あるシーケンスの終わりから次のシーケンスの始まりまでにどれだけジャンプするかを計算します。開始値が繰り返される場合、ジャンプは負になる可能性があります。この配列が満たされると、出力は単純にシーケンスの累積合計または cumsum になります。

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);
于 2015-03-10T23:10:11.643 に答える