convert cell into double with diferent cell sizes

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

I know that it's possible to pad an array, but I'm not sure of the code. I would suggest making an array with the number of columns equal to the largest cell in res, then filling in the values from the cells of res. All extra elements will be NaN.
array = NaN(max(size(res{:})),size(res));
for I = 1:size(res);
array(:,I) = res(I);
end
I also can't guarantee that size works properly with cell arrays, but that should at least get you started.
i did this, but only saves me for j=m, he does for j=1, for j=2, but only saves for j=2
[n,m] = size(A);
j = 1:m
table = res{j};
end
but doesnt work, because it only saves me the values of the 2nd cell
[n,m] = size(A);
j = 1
table = res{j};
end
j = 2
table2 = res{j};
end
he does what i want, but my original data have 140 j xD
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
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

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)

Thanks, works perfect! Will try on my big data to see if is good

Categories

Community Treasure Hunt

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

Start Hunting!