Get the Array Number, when value changes
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Hello, I have the following array:
1 Monday
2 Monday
3 Monday
4 Sunday
5 Sunday
6 Friday
7 Friday
8 Friday
...
I would like to get the array number when the value changes. These are the "limits" for the values. Then I want to save these limits in new arrays, in this case:
Limits.Monday:
1
3
Limits.Sunday:
4
5
Limits.Friday
6
8
Thanks :-)
Antworten (5)
Andrei Bobrov
am 29 Jul. 2015
Bearbeitet: Andrei Bobrov
am 29 Jul. 2015
A = {1 'Monday'
2 'Monday'
3 'Monday'
4 'Sunday'
5 'Sunday'
6 'Friday'
7 'Friday'
8 'Friday'};
[a,~,c] = unique(A(:,2),'stable');
Limits = cell2struct(accumarray(c,cell2mat(A(:,1)),[],@(x){[min(x);max(x)]}),a,1);
add variant
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);
2 Kommentare
Stephen23
am 29 Jul. 2015
Bearbeitet: Stephen23
am 29 Jul. 2015
Try this:
X = {1,'Monday';2,'Monday';3,'Monday';4,'Sunday';5,'Sunday';6,'Monday';7,'Monday'};
Y = [true;any(diff(char(X(:,2)),1,1),2);true];
idx = cumsum(Y(1:end-1));
out(:,2) = accumarray(idx,[X{:,1}],[],@(x){x([1,end])});
out(:,1) = X(Y(1:end-1),2);
and here is the output in the command window:
>> out
out =
'Monday' [2x1 double]
'Sunday' [2x1 double]
'Monday' [2x1 double]
>> out{1,2}
ans =
1
3
>> out{2,2}
ans =
4
5
>> out{3,2}
ans =
6
7
I did not put the data into a structure because while a structure with fields Monday, Tuesday, etc, makes perfect sense, placing indices in front of the names a) is not a valid variable/fieldname in MATLAB, and b) implies that the sequence order is significant, therefore an indexed container (e.g. a cell array) is more suitable.
0 Kommentare
Marv
am 4 Okt. 2015
1 Kommentar
Stephen23
am 4 Okt. 2015
Bearbeitet: Stephen23
am 4 Okt. 2015
The data matrix that you uploaded does not match the question. Your question states "I have the following array:"
1 Monday
2 Monday
3 Monday
4 Sunday
...
but your data file consists of a single vector of type double containing decimal values. This is a completely different format to what you question is asking about. If you want help then you need to provide clear explanations for us, and make sure that your data makes sense.
Do you want us the use your uploaded data, which has nothing to do with your question, or shall we invent some data ourselves?
You should read this, and please put into practice what it advises:
Stephen23
am 4 Okt. 2015
Bearbeitet: Stephen23
am 5 Okt. 2015
Given your uploaded data (attached below), this code will identify the locations where the value changes:
tol = 0.01;
data = load('Log_data_Changing_Value.mat');
idx = find(diff(data.A)>tol)
and it displays these in the command window:
idx =
57
585
1535
1997
2438
4298
If you explain exactly what you need to do with these indices then we can help you to use them too.
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!