Generating index from end and start index

78 ビュー (過去 30 日間)
Benoît Valley
Benoît Valley 2012 年 9 月 10 日
I am looking for an efficient way to do the following (without a loop so that large array can be handled efficiently). Any idea ?
A=rand(1,30) % some data from which I want to extract a subset
s=[1 5 10 22]; % start indexes of the subsets I want to extract
e=[3 7 17 25]; % end indexes of the subset I want to extract
R=[];
for i=1:length(s)
R=[R [s(i):e(i)]];
end
S=A(R); % the answer I am looking for, i.e. the subset of data I want to
% extract
  1 件のコメント
per isakson
per isakson 2012 年 9 月 10 日
編集済み: per isakson 2012 年 9 月 10 日
  1. Did you analyze your code with the function, profile?
  2. Which version of Matlab do you use?

サインインしてコメントする。

採用された回答

Matt Fig
Matt Fig 2012 年 9 月 10 日
If you don't want to use a mex file, this is very fast:
% Make your index into A
L = length(s);
F = cumsum(e-s+1);
idx = ones(1,F(end));
idx(1) = s(1);
idx(1+F(1:L-1)) = s(2:L)-e(1:L-1);
idx = cumsum(idx);
% Now use it as you need:
S = A(idx);

その他の回答 (2 件)

Oleg Komarov
Oleg Komarov 2012 年 9 月 10 日
I recommend the nice submission by Bruno Luong: multiple colon.
Use the mex routine, very fast and reliable.

Azzi Abdelmalek
Azzi Abdelmalek 2012 年 9 月 10 日
A=rand(1,30) ;
s=[1 5 10 22];
e=[3 7 17 25];
l=repmat(1:4,2,1);
idx=eval(['[' sprintf('s(%d):e(%d) ',l(:)') ']'])
S=A(idx)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by