2017-05-23 7 views
1

Je suis noob et j'ai trouvé des informations très fragmentées sur la pile sur Slinding Window.Trouble Comprendre Fenêtre coulissante pour une colonne d'une matrice, cas général et spécifique dans Matlab

J'ai une matrice mXn, où m est fixe (latitude, longitude, ax, ay, az), n pourrait changer de différents journaux.

1) Comment puis-je créer une fenêtre glissante uniquement pour az sans extraire le vecteur, puis l'analyser? 2) Si je veux sauvegarder toutes les lignes où l'écart-type az dépasse un seuil défini, comment puis-je faire cela?

3) Si la longueur des journaux n'est pas fixe, comment puis-je gérer cela? (Ex. Un fichier contient 932 lignes, un autre 953)

4) Je lis beaucoup de questions, je suis en train d'étudier comment bsxfun fonctionne dans ce cas, mais il est très clair pour moi (in this examples je n'undestood que une nouvelle matrice est créée, basée sur la taille de la fenêtre, puis la nouvelle matrice est analysée) (cette dernière question est fortement liée à ma formation ingénieur civil)


Voici ce que j'appris, et a essayé de regrouper. Sliding Window est un outil puissant qui permet d'analyser un signal ou une image. Lorsque j'ai essayé de décrire ma copine ce que je faisais je l'ai expliqué « est comme lire un livre avec une loupe, la loupe a une dimension définie et vous analysez le texte »

Sliding Window

La base chemin sur Matlab, pas la plus efficace, de le faire est

1. Définissez vos dimensions de vecteur

2. définiriez-vous wi dimension Ndow

3. Définir le nombre d'étapes

Voici un exemple de base que je l'ai écrit

a= randi(100,[1,50]);  %Generic Vector 
win_dim=3;     %Generic window size 

num_stps=(length(a)-win_dim) %number of "slides", we need to subtract win_dim to avoid that the window will go over the signal 
threshold= 15 %Generic number only for the example 
for i= 1:num_stps 
    mean_win(i)=mean(a(i:i+win_dim -1); %we subtract 1 or we make an error, and the code analyzes a segment bigger than one unit 
    std_win(i)=std(a(i:i+win_dim -1); %example for i=2 if we don't subtract 1 our segment starts from 2 until 5, so we analyze 
             % 2 3 4 5, but we defined a window dimension of 3 
    If std_win(i)> threshold 
    std_anomalies=std_win(i)    %here i think there is an error         
end  

De cette façon, les diapositives de code sur la totalité du signal, mais les fenêtres se chevauchent . Comment décider du "taux de chevauchement" (ou de l'incrément de glissement)?

Nous pouvons définir ceci comme "combien d'informations deux fenêtres adjacentes partagent-elles?" Half Segment Overlap Les examplei suivants ont fait est complètement faux, mais j'ai essayé de code quelque chose avant de demander ici, le but aurait aimé être un chevauchement pour La moitié du segment ou pas de chevauchement

%Half segment overlap 

a= randi(100,[1,20]); %Generic Vector 
win_dim=4; %generic window size  
%v is the increment vector in our case we desire to have 50% of overlap 
l= win_dim 
if l%2==0 
    v=l/2 
else 
    v=(l+1)/2 
end  

for i= 1:num_stps 
    if (i==1) 
    mean_win(i)=mean(a(1:1+win_dim -1); 
    else 
    mean(i)= mean(a (i+v:i+win_dim+v-1); 
end 

Répondre

2

I comme l'approche créative à la question! :) est-ce est ce que vous cherchez?

a = rand(100, 5); % the data 

window_size = 5; % size of the window 
overlap = 2; % desired overlap 
step = window_size - overlap; % compute the step 

threshold = 0.3; % large std threshold 

std_vals = NaN(size(a, 1), 1); 
for i=1:step:(size(a, 1) - window_size) 
    std_vals(i) = std(a(i:(i+window_size-1),5)); % calculate std of 5th col 
end 

% finding the rows with standard deviation larger than threshold 
large_indexes = find(std_vals>threshold); 

large_indexes vous donnera la ligne de départ des fenêtres qui ont des écarts types plus grandes que le seuil.stockera tous les écarts-types pour vous, au cas où vous en auriez besoin plus tard.

Si vous voulez des index de toutes les lignes dans la fenêtre de votre seuil satisfaisant, vous pouvez ajouter ceci à la fin

large_windows = zeros(numel(large_indexes), window_size); 
for i=1:window_size 
    large_windows(:,i) = large_indexes + i - 1; 
end 

où chaque rangée de large_windows donne des indices des lignes dans la fenêtre.

+0

J'ai besoin d'éclaircissements. Vous choisissez 'Nan' pour initialiser le vecteur std_vector? Pourquoi? Est-ce la première fois que je vois double ':' comment ça marche? Je vois toujours un seul Comment puis-je sauvegarder toutes les lignes dans la fenêtre qui ont l'élément (i, 5) qui satisfait la relation d'inégalité, pas seulement l'élément unique? Tnx pour votre temps et désolé pour mes questions stupides <3: D –

+0

Il n'y a pas de valeurs disponibles pour les lignes données, donc NaN est le choix le plus logique pour moi. Et il est plus facile de tester le seuil. Pour le côlon, voir ici: https://fr.mathworks.com/help/matlab/ref/colon.html. J'ai édité la réponse pour obtenir tous les numéros de rangée dans les groupes. Je recommanderais de lire la documentation et d'essayer un peu par vous-même, c'est la seule façon d'apprendre correctement. –

+0

Comment puis-je utiliser dans mon cas 'bsxfun (@ plus' pour une fenêtre glissante, comme dans cet exemple [link] (https://stackoverflow.com/questions/7099590/how-do-i-select-n-elements -of-a-sequence-in-windows-of-m-matlab)? –