convert cell into double with diferent cell sizes

5 views (last 30 days)
Hello, for example i have
A = [1,2;2,4;3,NaN;NaN,5;NaN,7]
res = cellfun(@(x) find (~isnan(x)),num2cell(A,1),'un',0) % Here i store in the index of the numbers that are not NaN
res is a 1x2 cell array, the first component is a 3x1 double and the second one is a 4x1 double.
res{1} = 1
2
3
res{2} = 1
2
4
5
My question is to do a table or a double, or a matrix that each res{j} is stored in the respective j column of the new table I tried a cell2mat, but since they aren't the same size it doesn't work. the goal is to make
output = 1 1
2 2
3 4
(empty or NaN or whatever) 5
  5 Comments
Bob Thompson
Bob Thompson on 2 Mar 2018
Edited: Bob Thompson on 2 Mar 2018
Are you actually trying to get rid of all of the NaN values, or just gather the non-NaN values together? If you're just trying to gather the values try using the following:
A = [1,2;2,4;3,NaN;NaN,5;NaN,7]
res = cellfun(@(x) find (~isnan(x)),num2cell(A,1),'un',0)
locationarray = NaN(size(A)); % Create an array the size of A, but filled with NaN values
for I = 1:size(A,2) % Run index I through each column of A, this should correspond to each cell in res
locationarray(:,I) = res{I}; % Put cell I of res into column I of the location array. Because it's in a for loop it will cover all columns
end
Tiago Dias
Tiago Dias on 5 Mar 2018
Edited: Tiago Dias on 5 Mar 2018
I want to store the index on NaN values, the way I do I store that in a cell, but I want to store if possible in a double, table or matrix. just that. But my input have values and NaN values numbers.
The code you wrote gets me an error:
Subscripted assigment dimension mismatch
Error in (line 5)
locationarray(:,I) = res{I};
If i use
locationarray = res{I}
It only store in location array the information when I=2, doesnt save for I=1

Sign in to comment.

Accepted Answer

Jos (10584)
Jos (10584) on 5 Mar 2018
You can my PADCAT function to concatenate vectors with different lengths. It is available at the Matlab File Exchange:
However, there are simpler ways to get the output res, from A:
A = [1,2;2,4;3,NaN;NaN,5;NaN,7]
res = repmat(1:size(A,1),size(A,2),1)' ;
res(isnan(A)) = NaN
res = sort(res)

More Answers (1)

Tiago Dias
Tiago Dias on 5 Mar 2018
Thanks, works perfect! Will try on my big data to see if is good

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!