La matrice A est ma matrice de départ qui contient les données enregistrées depuis mon MPU6050 et GPS sur une carte SD (Latitude, Longitude, Heure, Axe , Ay, Az, Gx, Gy, Gz).Meilleure façon d'extraire toutes les lignes d'une matrice A contenant un élément d'une matrice B
J'ai calculé l'écart-type de Az pour la taille de fenêtre de 5 et identifié tous les éléments qui satisfont une condition (> seuil).
Ensuite, dans une matrice "large_windows" j'ai stocké l'index de tous les Az dans la fenêtre qui satisfont la condition.
De matrice « large_windows » i calcule une nouvelle matrice B avec toutes les lignes de la matrice A qui contiennent la matrice « large_windows » éléments.
Je pense que mon code est effective, mais très laid et chaotique, plus je ne suis toujours pas très pratique avec indexing mais je veux apprendre.
1. Une meilleure solution existe-t-elle?
2. Il est possible d'utiliser une indexation logique? Comment? C'est efficace *?
Voici mon code, est un exemple simplifié, avec condition générique, de comprendre le concept mieux non seulement ma situation particulière, starting from suggestions of a previous problem(how to create a sliding window
%random matix nXm
a=rand(100,6);
%window dimension
window_size=4;
%overlap between two windows
overlap=1;
%increment needed
step=window_size - overlap;
%std threshold
threshold=0.3;
std_vals= NaN(size(a,1),1);
%The sliding window will analyze only the 5th column
for i=1: step: (size(a,1)-window_size)
std_vals(i)=std(a(i:(i+window_size-1),5));
end
% finding the rows with standard deviation larger than threshold
large_indexes = find(std_vals>threshold);
%Storing all the elements that are inside the window with std>threshold
large_windows = zeros(numel(large_indexes), window_size);
for i=1:window_size
large_windows(:,i) = large_indexes + i - 1;
end
% Starting extracting all the rows with the 5th column outlier elements
n=numel(large_windows);
%Since i will work can't know how long will be my dataset
%i need to knwo how is the "index distance" between two adjacent elements
% in the same row [es. a(1,1) and a(1,2)]
diff1=sub2ind(size(a),1,1);
diff2=sub2ind(size(a),1,2);
l_2_a_r_e = diff2-diff1 %length two adjacent row elements
large_windows=large_windows'
%calculating al the index of the element of a ith row containing an anomaly
for i=1:n
B{i}=[a(large_windows(i))-l_2_a_r_e*4 a(large_windows(i))-l_2_a_r_e*3 a(large_windows(i))-l_2_a_r_e*2 a(large_windows(i))-l_2_a_r_e*1 a(large_windows(i))-l_2_a_r_e*0 a(large_windows(i))+l_2_a_r_e];
end
C= cell2mat(B');
Je lis aussi une question avant de poster, mais This was to specific
B ne figure pas dans A cette question est donc pas utile Find complement of a data frame (anti - join)
I don't know how to useismember
dans thi s cas particulier
J'espère que mon dessin pourrait mieux expliquer mon problème :)
Je ne sais pas si je comprends bien ce que vous cherchez. Par exemple, à la place de votre boucle for, vous pouvez utiliser 'large_windows = repmat (large_indexes. ', Window_size, 1) + (0: 3).'' Ou 'large_windows = bsxfun (@ plus, large_indexes, 0: 3). ' 'pour créer votre tableau' large_windows'. Ce serait probablement un peu plus efficace. Cherchez-vous ce genre de choses? Votre objectif est-il de rendre votre code plus rapide? Traitez-vous de grandes quantités de données? Ou essayez-vous juste de prétendre le code et de comprendre des trucs fantaisistes d'indexation matlab? – Max
@uomodellamansarda Si le résultat final est la matrice B, vous n'avez pas vraiment besoin de calculer la matrice "large_windows". Vous pouvez obtenir "B" directement à partir de "large_indexes". Que pensez-vous de cela? –
@Max mon objectif est de rendre mon code plus rapide, parce que j'ai plus de 4k lignes, mais je veux comprendre des trucs de matlab-indexing (ils ne sont pas utiles, je suis un noob, pas d'informatique et tout le monde me décourage à utiliser pour la boucle sur matlab) :) Merci pour votre suggestion je vais étudier et ensuite l'essayer :) <3 –