find indices of each first repeated elements in the array (full of repeated values)
23 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Limei Cheng
el 12 de Ag. de 2020
Editada: Limei Cheng
el 12 de Ag. de 2020
The array is about millions length long and full of small segments each with repeated values. Part of the array example is here:
B=[0 0 0 0 0 0 0 0.6775 ...
0.6775 0.6775 0.6775 0.6775 0.6775 0.6775 0.6775 0.7575 ...
0.7575 0.7575 0.7575 0.7575 0.7575 0.7575 0.7575 0.7575 ...
0.7575 0.7575 0.7575 0.7575 0.7575 0.6775 0.6775 0.6775 ...
0.6775 0.6775 0.6775 0.6200 0.6275 0.6275 0.6275 0.6275 ...
0.6275 0.5900 0.5975 0.5975 0.5975 0.5975 0.5975 0.5875 ...
0.5875 0.5875 0.5875 0.5875 0.5875 0.5875 0.5875 0.5875 ...
0.5875 0.5875 0.5875 0.5875 0.5875 0.5875 0.5875 0.5875 ...
0.5875 0.5575 0.5575 0.5575 0.5575 0.5575 0.5175 0.5175 ...
0.5175 0.5175 0.5175 0.4875 0.4875 0.4875 0.4875 0.4875 ...
0.4975 0.4975 0.4975 0.4975 0.4975 0.5075 0.5075 0.5075 ...
0.5075 0.5075];
And my problem is trying to find begiing index of each segments (with >=2 same elements inside) for the whole long array. For segment only has one value, we should ignore it. And in this example, the initial solution should be as below:
indexB=[1 8 16 30 37 43 48 66 71 76 81 86];
for different segments of 0s, 0.6775s, 0.7575s, 0.6775s again, B(36)=0.62 is ignored, 0.6275s, B(42)=0.59 is ignored, 0.5975s, 0.5875s, 0.5575s, 0.5175s, 0.4875s, 0.4975s. 0.5075s.
Problem 1 solved with the help of Alex. Thx.
Problem 2 is about the find those missing index for the two segments with same repeated elements and sit next to each other. It's important to find these missing index for further data processing.
Now, we need to add the missing index in the middle of some long segment as below:
NewIndex = diff([indexB,numel(B)+1]); % NewIndex=[7 8 14 7 6 5 18 5 5 5 5 5];
ind=find(NewIndex>=mean(NewIndex*2)-2); %ind = [3 7]
%interplate new index into index B
newIndexB= [indexB(1: ind(1)), indexB(ind(1)+ round((indexB(ind(1)+1)-indexB(ind(1)))/2), indexB(ind(1)+1: ind(2)), indexB(ind(2))+round((indexB(ind(2)+1)-indexB(ind(2)))/2) , indexB(ind(2)+1:end);
The final solution should be
newindexB=[1 8 16 16+7 30 37 43 48 48+9 66 71 76 81 86];
I have used for loop to do the find the initial solution and final solution. Is there other way without using for loop to save time?
3 comentarios
Respuesta aceptada
J. Alex Lee
el 12 de Ag. de 2020
It's too early for me to attempt to understand your 2nd problem, but for the first problem try using "diff"
indexB0 = [1,1+find(diff(B))]
This will not filter your "single" sequences, so you can filter those out by applying diff on the indexB0
Más respuestas (0)
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!