Split array into separate arrays at row with NaNs
24 views (last 30 days)
Show older comments
Douglas Anderson
on 14 Apr 2017
Commented: Andrew Sol
on 21 Jan 2023
Hello,
Probably a simple problem? I have been sent some data in an Excel file that has several sets of data on one sheet. The data are separated into the individual sets with a blank line, that becomes a row of "NaN"s. How can I make separate arrays from this big one? I didn't see the answer to this in documentation.
Thanks!
Doug Anderson
0 Comments
Accepted Answer
Stephen23
on 14 Apr 2017
Edited: Stephen23
on 14 Apr 2017
First lets define some trial data:
>> M = [0,1;2,3;NaN,NaN;4,5;6,7;NaN,NaN;8,9]
M =
0 1
2 3
NaN NaN
4 5
6 7
NaN NaN
8 9
>> idx = all(isnan(M),2);
>> idy = 1+cumsum(idx);
>> idz = 1:size(M,1);
>> C = accumarray(idy(~idx),idz(~idx),[],@(r){M(r,:)});
>> C{:}
ans =
0 1
2 3
ans =
4 5
6 7
ans =
8 9
>> idr = diff(find([1;diff(idx);1]));
>> D = mat2cell(M,idr(:),size(M,2));
>> D{1:2:end}
ans =
0 1
2 3
ans =
4 5
6 7
ans =
8 9
>> C{2}
ans =
4 5
6 7
Warning: Whatever you do, do NOT try to create lots of arrays in the workspace. This will be slow, buggy, obfuscated, and makes working with the data difficult:
6 Comments
Peng Li
on 31 Mar 2020
@Stephen Cobeldick
Just a comment that the accumarray solution doesn't correctly deal with contiguous rows of NaNs, as as long as there are more than 1 contiguous rows of NaNs, cumsum will pick additional NaN rows, which results in a jump in idy(~idx). Therefore, the final C will contains cell elements that are empty. So additional steps are required to filter them. See an example modified based on yours:
M = [0,1;2,3;NaN,NaN;nan nan; nan nan; 4,5;6,7;NaN,NaN;8,9];
idx = all(isnan(M),2);
idy = 1+cumsum(idx);
idz = 1:size(M,1);
C = accumarray(idy(~idx),idz(~idx),[],@(r){M(r,:)})
C =
5×1 cell array
{2×2 double}
{0×0 double}
{0×0 double}
{2×2 double}
{1×2 double}
More Answers (0)
See Also
Categories
Find more on Logical in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!