Création des indices droite avec bsxfun
devrait certainement aider:
ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).');
out = T(ind);
Création des indices de droite est la première étape, délimitée par la première ligne de code . Ce que fait ce code, c'est qu'il crée une matrice 2D où chaque ligne est les éléments à accéder par fenêtre d'intérêt. Si vous voulez acquérir de l'intuition sur la façon dont le code génère les indices, regardez spécifiquement le premier cas où X = 1;
et W = 3;
.
On peut voir que la première ligne consiste à accéder aux éléments 1, 2, 3. La deuxième ligne consiste à accéder aux éléments 2, 3, 4 ... jusqu'à la dernière rangée, qui est 5, 6, 7. Nous pouvons voir que nous devons accéder aux éléments voisins dans une fenêtre, et donc les indices de base doivent aller de 1, 2, 3, ou en général de 1 à W
. Nous avons maintenant besoin de offset ces indices afin qu'ils soient centrés sur les bons éléments dans T
par fenêtre. Le décalage pour la première fenêtre est simplement 0, le décalage suivant pour la deuxième fenêtre est simplement 1 jusqu'à la dernière rangée qui est 3. Nous voyons que pour chaque rangée, nous ajoutons 1 plus aux index de base que les rangées augmentent. Par conséquent, nous ajoutons 1 à chaque index de base pour la deuxième rangée, puis 2 pour chaque index de base dans la troisième rangée et ainsi de suite. Si vous ajoutez les indices de base avec les indices de décalage, vous obtenez ainsi les indices corrects pour accéder aux bons éléments dans T
.
De même si X = 2;
et W = 3;
, nous voyons que nous avons encore des indices de base de 1, 2, 3.Cependant, les bons éléments pour accéder maintenant sont 1, 2, 3 pour la première rangée, puis 3, 4, 5 pour la deuxième rangée puis 5, 6, 7 pour la troisième rangée. Pour chaque ligne, nous compensons maintenant les indices de base par au lieu de 1 maintenant. Par conséquent, la deuxième rangée ajoute 2 à chaque index de base, puis nous ajoutons 4 à chaque index de base pour la troisième rangée et ainsi de suite.
En général, les indices de base sont créés en utilisant un vecteur 1:W
et les indices de décalage sont créés en utilisant un vecteur 0:X:numel(T)-W
. La soustraction de W
est nécessaire afin que nous ne sortons pas des limites lors de l'échantillonnage du signal selon les exigences. Pour créer ces indices dont nous venons de parler, bsxfun
gère cela pour nous.
Nous créons un vecteur ligne de 1:W
qui correspond aux index de base et un vecteur colonne de (0:X:numel(T)-W).'
qui correspond aux décalages par fenêtre. Notez que le premier décalage commence à 0, puis nous augmentons de X
le montant pour nous assurer que le centre correct est calculé pour placer nos indices de base à. Nous nous arrêtons jusqu'à ce que nous atteignions numel(T)-W
éléments, ce qui est la condition que vous avez indiquée. En utilisant bsxfun
, deux matrices 2D temporaires sont créées où le vecteur de ligne est dupliqué pour autant de lignes qu'il y a de lignes dans le vecteur de colonne et le vecteur de colonne est dupliqué pour autant de colonnes qu'il y a dans le vecteur ligne. Une fois que vous avez ajouté ces deux matrices, vous obtenez la matrice d'index résultante.
L'exécution du code avec W = 3;
et X = 1;
donne:
>> T = [1, 5, 6, 8, 10, 14, 22];
>> X = 1;
>> W = 3;
>> ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).')
ind =
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
De même, si W = 3;
et X = 2;
nous obtenons aussi:
>> T = [1, 5, 6, 8, 10, 14, 22];
>> X = 2;
>> W = 3;
>> ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).')
ind =
1 2 3
3 4 5
5 6 7
Vous pouvez vérifier par vous-même que ces indices correspondent aux éléments corrects dans T
pour créer votre matrice souhaitée dans ce cas.
Nous utilisons enfin ce pour indexer dans notre matrice pour saisir les bons éléments:
out = T(ind);
Faire cela pour X = 1;
et W = 3;
donne:
>> out = T(ind)
out =
1 5 6
5 6 8
6 8 10
8 10 14
10 14 22
De même pour X = 2;
et W = 3;
donne:
>> out = T(ind)
out =
1 5 6
6 8 10
10 14 22
Vous devez avoir des informations plus avant avant vectorisation. Néanmoins, je ne vois pas un moyen de faire sans une boucle for ... – 16per9
De quel type d'opération avez-vous besoin pour calculer? Est-ce qu'une convolution ne t'aide pas? –
Ne pas rejeter les boucles si rapidement; Parfois, ils sont plus rapides que les alternatives. Mais je suis d'accord avec les commentaires précédents, nous avons besoin de plus d'informations sur les opérations que vous devez effectuer sur ces fenêtres. – beaker