2017-07-07 7 views
2

je the same code pour deux matrices d'entrée différents, Dans les deux cas, je vais l'appeler « la matrice d'entrée A »erreur en utilisant sub2ind (ligne 52) hors échelle indice Matlab

Le premier cas est un 7000X4

le second cas est un 29500X12

je besoin de diviser une colonne sélectionnée dans les fenêtres puis pour chaque fenêtre i besoin de calculer le std et stocker la valeur à l'intérieur d'une matrice std_vals

J'ai pris soin de changer la valeur de mes variables d'entrée.

Dans le premier cas, mon objectif était d'analyser la 4ème colonne, dans le second cas mon objectif était d'analyser la 12e colonne

Dans le premier cas, le code a travaillé dans le second cas

la Code me retourne un message d'erreur

J'ai essayé d'analyser toutes les étapes du code, mais je dind't trouver l'erreur.

Pourriez-vous s'il vous plaît me aider à mieux comprendre?

column_length=size(A,1); 
Amod= mod(column_length,100); 
if Amod~=0 
    A=A(1:(size(A,1)-Amod),:); 
    end 
newlenght=size(A); 

%selected column vector to analyze 
columnselected=4; 
%window dimension 
window_size=200; 

%overlap between two windows 
overlap=0; 

%increment needed 
step=window_size - overlap; 

%std threshold 
soglia=2; 
std_vals= NaN(size(A,1),1); 
devstd=std(A(:,4)); 

stdInds=bsxfun(@plus,1:step:(size(A,1)-overlap),(0:(window_size-1)).'); 

%In the first case size(stdInds)=200X35 
%In the second case size(stdInds)=200X148 
%In the first case size(repmat(columnselected,size(stdInds))= 200X35 
%In the second case size(repmat(columnselected,size(stdInds))= 200X148 
%In the first case size(A)=7000X4 
%In the second case size(A)=29500X12 
    std_vals=std(A(sub2ind(size(A),stdInds,repmat(columnselected,size(stdInds))))); 

highStdWindows=find(std_vals>soglia); 

Je suis autodidacte. Pour mieux comprendre mon erreur, je réécris d'abord sur un morceau de papier le code, puis j'analyse chaque étape, et j'étudie la sortie. Je me suis pris plus de 4 heures.

J'ai essayé aussi de mettre dans le second cas un vecteur 7000X12, mais le code me retourné la même erreur.

Je pense que ma méthode n'est pas très efficace. Étant donné que votre chevauchement pour les fenêtres est zéro, le code ci-dessous devrait fonctionner pour tout tableau d'entrée A enter image description here

+0

Je n'ai pas résolu la question de savoir pourquoi vous obtenez des erreurs, mais j'ai fourni une autre solution ci-dessous pour le cas trivial de chevauchement zéro entre les fenêtres. –

+0

@ b3. il y a une erreur étrange ou une anomalie dans l'ensemble de données, je vais aller en profondeur, parce que j'ai essayé avec un 102047X12 et cela fonctionne sans problème –

Répondre

0

Remplacez les variables COLUMN_INDEX et WINDOW_SIZE par la taille de colonne et de fenêtre souhaitée.

L'idée est de remodeler la colonne désirée pour qu'elle soit WINDOW_SIZE x N. Ensuite, appelez simplement la fonction std qui fonctionne sur les colonnes de ce tableau remodelé.

COLUMN_INDEX = 4; 
WINDOW_SIZE = 200; 

windowCount = floor(size(A, 1)/WINDOW_SIZE); 
windowedColumn = reshape(A(1:WINDOW_SIZE*windowCount,COLUMN_INDEX), WINDOW_SIZE, windowCount); 
stdVals = std(windowedColumn); 
1

L'erreur que vous obtenez de sub2ind n'est pas causée par la taille des arguments, mais plutôt par leurs valeurs - donc la meilleure façon de le déboguer serait de regarder ces arguments par exemple en les complotant.

est ici une théorie sur ce qui se passe, mais il n'explique pas tout ce que vous avez signalé (il suggère le tableau de 7000x12 aurait travaillé):

Je pense que le problème ici est que la première partie de votre code recoupe l'entrée de sorte que sa hauteur soit un multiple de 100. Cependant, la taille de votre fenêtre est de 200 et ces nombres auraient dû être les mêmes (pour 0 chevauchement). C'est parce que vous calculez les points de départ de vos fenêtres avec 1:step:(size(A,1)-overlap) = 1:200:size(A,1) qui produira une dernière fenêtre qui ne rentre pas dans A sauf si size(A,1) est un multiple de 200.

Compte tenu de la taille du tableau que vous avez essayé:

  • 7000x4: 7000 est un multiple de 200 si cela fonctionne
  • 29500x12: 29500 est pas un multiple de 200 si cela ne fonctionne pas (le dernier élément de 1: 200: 29500 est 29401, de sorte que la dernière fenêtre est 29401: 29600)
  • 102047x12: 102047 est tronqué à 102000 qui est un multiple de 200 si cela fonctionne
  • 7000x12: cela devrait fonctionner de la même manière que 7000x4 - ce qui est incompatible avec ce que vous avez vu!