Get Array Number when value changes - Code does not work

조회 수: 2 (최근 30일)
Marv
Marv 2015년 10월 5일
편집: Voss 2023년 12월 21일
This Code works:
A = {1 'Monday'
2 'Monday'
3 'Monday'
4 'Sunday'
5 'Sunday'
6 'Monday'
7 'Monday'
8 'Friday'};
[a,~,c] = unique(A(:,2),'stable');
i1 = [true;diff(c)~=0];
x = accumarray(cumsum(i1),cell2mat(A(:,1)),[],@(x){[min(x);max(x)]});
y = strcat(A(i1,2),{'_'},arrayfun(@(x)sprintf('%d',x),(1:nnz(i1))','un',0));
Limits = cell2struct(x,y,1);
But when I use numbers in the cell, then it does not work anymore:
A = {1 6
2 6
3 8
4 8
5 8
6 8
7 4
8 4};
[a,~,c] = unique(A(:,2),'stable');
i1 = [true;diff(c)~=0];
x = accumarray(cumsum(i1),cell2mat(A(:,1)),[],@(x){[min(x);max(x)]});
y = strcat(A(i1,2),{'_'},arrayfun(@(x)sprintf('%d',x),(1:nnz(i1))','un',0));
Limits = cell2struct(x,y,1);
Can someone help me please ? :-) Thanks

답변 (1개)

Voss
Voss 2023년 12월 21일
편집: Voss 2023년 12월 21일
Three things work differently when you have numbers vs when you have character vectors:
1.) You cannot unique() a cell array of numbers. Make them into a numeric vector first.
2.) Applying strcat() to a number is probably not doing what you want, e.g.:
strcat({6; 8},{'_'},{'1'; '2'})
ans = 2×1 cell array
{'□_1' } {_2'}
In that example, I imagine you'd want:
strcat({'6'; '8'},{'_'},{'1'; '2'})
ans = 2×1 cell array
{'6_1'} {'8_2'}
wherein the conversion from numbers {6; 8} to character vectors {'6'; '8'} can be done by
cellfun(@(x)sprintf('%d',x),A(i1,2),'un',0)
or in R2016b or later by
compose('%d',vertcat(A{i1,2}))
But, 3.) Field names in a struct cannot start with a digit; they have to start with a letter. To fix that, I've prepended 'field_' to each field name.
A = {1 6
2 6
3 8
4 8
5 8
6 8
7 4
8 4};
[a,~,c] = unique(vertcat(A{:,2}),'stable');
i1 = [true;diff(c)~=0];
x = accumarray(cumsum(i1),cell2mat(A(:,1)),[],@(x){[min(x);max(x)]});
% cellfun/sprintf method:
y = strcat('field_',cellfun(@(x)sprintf('%d',x),A(i1,2),'un',0),{'_'},arrayfun(@(x)sprintf('%d',x),(1:nnz(i1))','un',0));
% compose method (R2016b or later):
y = strcat('field_',compose('%d',vertcat(A{i1,2})),{'_'},arrayfun(@(x)sprintf('%d',x),(1:nnz(i1))','un',0));
Limits = cell2struct(x,y,1)
Limits = struct with fields:
field_6_1: [2×1 double] field_8_2: [2×1 double] field_4_3: [2×1 double]

카테고리

Help CenterFile Exchange에서 Data Type Conversion에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by