Split an array according to a logic

21 ビュー (過去 30 日間)
TV8
TV8 2021 年 11 月 1 日
編集済み: Jon 2021 年 11 月 1 日
Is there a way to split a vector ,
say;
[1 2 3 6 7 8 12 13 14 15 ] ....( the actual vector is much longer )
into preassigned groups or cells such that cosecutive numbers
{1 2 3 } { 6 7 8} {12 13 14 15} .... are grouped in different cells.
Thanks a ton.

採用された回答

Jon
Jon 2021 年 11 月 1 日
編集済み: Jon 2021 年 11 月 1 日
If the numbers are ordered as you show them you can just use reshape() to make them into a m by 3 array. If you really need it to be a cell you can convert that using mat2cell
So for example
x = 1:30
X = reshape(x,10,3)
Xcell = mat2cell(X,ones(10,1))
  9 件のコメント
Jon
Jon 2021 年 11 月 1 日
Oh, I see, I don't catch the last element in each group. I have to think about how to fix that.
Jon
Jon 2021 年 11 月 1 日
編集済み: Jon 2021 年 11 月 1 日
I think this now catches the end of each consecutive group too. Most of the logic is the same, but I realized you have to look forward and backward to see if they are consecutive and not miss the ends of the groups
% example vector containing groups of consectutive numbers
x = [1 2 3 6 7 8 12 13 14 15 18 19 20 31 35 36 40 41];
% elements are consecutive if they the next element is one larger than they
% are
idlFwd = [diff(x)== 1 0];
% elements are also consecutive if the one before them is one less than they are
idlBwd = [0 flip(diff(flip(x))== -1)]
% elements are consecutive if either criteria is met
idl = idlFwd|idlBwd;
% mark where beginning of each group of consecutive elements occurs, these
% are jumps from 0 to 1
iStart = diff([0 idlFwd])==1;
% count up jumps to form group numbers
groupCount = cumsum(iStart);
% assign group number, but only to ones that belong to a group (the
% consecutive values)
% (for non-members groupCount.*idl is zero so these are assigned to group
% zero)
group = groupCount.*idl ;
% loop through to assign to cell array by group
numGroups = max(group);
X = cell(numGroups,1);
for k = 1:numGroups
X{k} = x(k==group);
end
disp(X)
1 2 3 6 7 8 12 13 14 15 18 19 20 31 35 36 40 41
{[ 1 2 3]}
{[ 6 7 8]}
{[12 13 14 15]}
{[ 18 19 20]}
{[ 35 36]}
{[ 40 41]}

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

その他の回答 (0 件)

カテゴリ

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

製品

Community Treasure Hunt

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

Start Hunting!

Translated by