Deleting Rows inbetween NaN values.
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
I got a row vector that looks like this: V = [ 1 4 5 NaN 0 9 3 1 3 NaN 1 5 3 0 7 NaN 7 4 2 1 NaN 9 4 ]. I want to delete all the columns in between the NaN values, and place the remaining columns in a cell array, it will look like this: Output = { [ 1 4 5 ] [ 1 5 3 0 7 ] [ 9 4 ] }. Not all the vectors in the array will be the same length, so a simple reshape will not work. There are thousands of lines as well. Thank You.
2 comentarios
Peng Li
el 14 de Abr. de 2020
It wasn't quite clear that the [1 5 3 0 7] subset is also in between two NaN values, while you keep it?
Respuestas (2)
Stephen23
el 23 de Abr. de 2020
Editada: Stephen23
el 23 de Abr. de 2020
>> V = [1,4,5,NaN,0,9,3,1,3,NaN,1,5,3,0,7,NaN,7,4,2,1,NaN,9,4];
>> X = isnan(V);
>> Y = cumsum(X);
>> F = @(n) V(~X&(n==Y));
>> C = arrayfun(F, 0:2:max(Y), 'UniformOutput',false);
>> C{:}
ans =
1 4 5
ans =
1 5 3 0 7
ans =
9 4
0 comentarios
Vinai Datta Thatiparthi
el 23 de Abr. de 2020
Hi Chad,
Understanding the problem from the single example that you mentioned, this following approach was one of the simplest that I could think of -
v = [ 1 4 5 NaN 0 9 3 1 3 NaN 1 5 3 0 7 NaN 7 4 2 1 NaN 9 4 ]; % Input array
idN = isnan(v); % For NaNs in array
idF = find(idN == 1); % Find indices of NaNs
out = {}; % Output cell array
for i = 1:2:numel(idF)
if i == 1
out{end+1} = v(1:idF(1)-1); % For first index
else
out{end+1} = v(idF(i-1)+1:idF(i)-1); % For the rest
end
end
if rem(numel(idF),2) == 0
out{end+1} = v(idF(end)+1:end); % At the end
end
Hope this helps!
0 comentarios
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!