Can I arrange a double array into cell array based on discontinuity of values?

조회 수: 1 (최근 30일)
Josh Hwa
Josh Hwa 2019년 4월 28일
댓글: Dyuman Joshi 2023년 12월 14일
I have 1x15 double array defined as 'a' and I would like to make them classified into each cell column if the increment of value is broken. This is my code, I have no idea how to make a1 become a2. If the next value is not the prvious number, n+1, then it should break and create new cell column.
axis([0 30 0 30]);
hold on;
a1=[1 2 3 4 5 10 11 12 13 18 19 20 21 22 23];
a2={[1 2 3 4 5] [10 11 12 13] [18 19 20 21 22 23]} ;
cellfun(@(x) plot(x,x), a2);
The length is not fixed, it could be like this
a1=[1 2 3 4 5 6 7 8 9 10 11 12 13 18 19 20 21 22 23];
a2={[1 2 3 4 5 6 7 8 9 10 11 12 13] [18 19 20 21 22 23]} ;
or like this.
a1=[1 2 3 4 11 12 13 18 19 20 21 22 23 30 31 32 33 40 41 42];
a2={[1 2 3 4] [11 12 13] [18 19 20 21 22 23] [30 31 32 33] [40 41 42]};

답변 (1개)

Voss
Voss 2023년 12월 14일
a1=[1 2 3 4 5 10 11 12 13 18 19 20 21 22 23];
a2 = split_vector(a1)
a2 = 1×3 cell array
{[1 2 3 4 5]} {[10 11 12 13]} {[18 19 20 21 22 23]}
a1=[1 2 3 4 5 6 7 8 9 10 11 12 13 18 19 20 21 22 23];
a2 = split_vector(a1)
a2 = 1×2 cell array
{[1 2 3 4 5 6 7 8 9 10 11 12 13]} {[18 19 20 21 22 23]}
a1=[1 2 3 4 11 12 13 18 19 20 21 22 23 30 31 32 33 40 41 42];
a2 = split_vector(a1)
a2 = 1×5 cell array
{[1 2 3 4]} {[11 12 13]} {[18 19 20 21 22 23]} {[30 31 32 33]} {[40 41 42]}
function out = split_vector(a)
d = diff(a);
n = diff(find([true, d>min(d), true]));
out = mat2cell(a,1,n);
end
  댓글 수: 1
Dyuman Joshi
Dyuman Joshi 2023년 12월 14일
Another method -
a1=[1 2 3 4 5 10 11 12 13 18 19 20 21 22 23];
a2 = split_vector(a1)
a2 = 1×3 cell array
{[1 2 3 4 5]} {[10 11 12 13]} {[18 19 20 21 22 23]}
a1=[1 2 3 4 5 6 7 8 9 10 11 12 13 18 19 20 21 22 23];
a2 = split_vector(a1)
a2 = 1×2 cell array
{[1 2 3 4 5 6 7 8 9 10 11 12 13]} {[18 19 20 21 22 23]}
a1=[1 2 3 4 11 12 13 18 19 20 21 22 23 30 31 32 33 40 41 42];
a2 = split_vector(a1)
a2 = 1×5 cell array
{[1 2 3 4]} {[11 12 13]} {[18 19 20 21 22 23]} {[30 31 32 33]} {[40 41 42]}
function out = split_vector(a)
idx = [find(diff(a)~=1) numel(a)];
out = mat2cell(a, 1, [idx(1) diff(idx)]);
end

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by