specific number index how data array matlab find return-value chain

number - how to find a value in a vector matlab



encontrar valores consecutivos distintos de cero (2)

Estoy intentando escribir un programa MATLAB simple que encontrará la primera cadena (más de 70) de valores consecutivos distintos de cero y devolverá el valor inicial de esa cadena consecutiva.

Estoy trabajando con datos de movimiento de un joystick y hay unos miles de filas de datos con una combinación de ceros y valores distintos de cero antes de que comience la prueba real (viniendo de sujetos moviendo ligeramente el joystick antes de que realmente comenzara la prueba).

Necesito deshacerme de estas filas antes de poder comenzar a analizar el movimiento de las pruebas.

Estoy seguro de que esto es algo relativamente simple de hacer, así que esperaba que alguien pudiera ofrecer una visión. Gracias de antemano

EDITAR: Esto es lo que intenté:

s = zeros(size(x1)); for i=2:length(x1) if(x1(i-1) ~= 0) s(i) = 1 + s(i-1); end end display(S);

para un vector x1 que tiene una cadena máxima de 72 pero no sé cómo encontrar la cadena máxima y devolver su primer valor, así que sé dónde recortar. También realmente no creo que esta sea la mejor estrategia, ya que la cadena máxima en mis datos será de decenas de miles de valores.


Esta respuesta es genérica para cualquier tamaño de cadena. Encuentra la cadena más larga en un vector x1 y recupera el primer elemento de esa cadena val .

Primero usaremos bwlabel para etiquetar componentes conectados, por ejemplo:

s=bwlabel(x1);

Entonces podemos usar tabulate para obtener una tabla de frecuencias de s , y encontrar el primer elemento del componente conectado más grande:

t=tabulate(s); [C,I]=max(t(:,2)); val=x1(find(s==t(I,1),1, ''first''));

Esto debería funcionar para el caso de que tenga una cadena de tamaño máximo distinta. ¿Qué sucede para el caso si tienes más de una cadena que tiene longitudes máximas? (Todavía puedes usar mi código con ligeras modificaciones ...)


No necesita usar un vector auxiliar para realizar un seguimiento del índice:

for i = 1:length(x) if x(i) ~= 0 count = count + 1; elseif count >= 70 lastIndex = i; break; else count = 0; end if count == 70 index = i - 69; end end

Para eliminar todos los elementos de la cadena de x , simplemente puede hacer:

x = x([lastIndex + 1:end]);

EDITAR (basado en comentario):
La razón por la que no funcionó fue porque no reinició el contador cuando se encontró con un 0, eso es lo que el:

else count = 0;

es para; restablece el proceso, si lo desea. Para mayor claridad, en su código original, esto se reflejaría en:

if x1(i-1) ~= 0 s(i) = 1 + s(i-1); else s(i) = 0; end