Remove empty cells and values for correlations

Hi,
I have a 32x2 cell and I would like to do a correlation for the values in the first column with the values in the second column. However, there are blank cells in the first column. Could anyone help me find a way to do a correlation that excludes all the blank cells and their corresponding values in the second column?
Thanks!

2 Comments

"Blank cells" is not quite specific enough. Could you post a very small example (maybe 4x2 or so) that illustrates your input cell array? For example, do you mean
C = cell(4,2);
C{1,1} = 3;
C{1,2} = 4;
C{2,2} = 4;
C{3,1} = 6;
C{3,2} = 5;
C{4,1} = 4.1;
C{4,2} = 6.2;
where the 2nd row of the first column is an empty cell?
Or do you mean something else by "blank"?
Thang  Le
Thang Le on 17 Jun 2014
Edited: Thang Le on 17 Jun 2014
I'm sorry for not being specific. An example would be:
[45] [20]
[16] [32]
[] [10]
[17] [6]
So (3,1) is an empty cell. So this is the same as your example, I think.

Sign in to comment.

 Accepted Answer

Does this do what you want?
CData = {45 20; 16 32; [] 10; 17 6};
CE = cellfun(@isempty, CData(:,1));
Data = cell2mat(CData(~CE,:));
[R, P] = corrcoef(Data)

6 Comments

Thank you Star, Strider! This is indeed what I was looking for.
Hi Star Strider, slight adjustment to my question: what if either column or both columns have [] (as opposed to just the first colmn as in my original question). How would I change the code to account for those possibilities? I've tried several things but usually got the Index exceeds matrix dimensions error.
It seems that none of the logical indexing that I find so useful with double arrays works with cell arrays (or at least it doesn’t work for me with cell arrays). Finding all the rows with a missing value was easy enough (my ‘CE’ variable). I finally resorted to a loop to collect only the data with complete rows:
CData = {45 20; 16 32; [] 10; 17 6; 25 []};
CE = cellfun(@or, CData(:,1), CData(:,2), 'Uni',0);
k2 = 0;
for k1 = 1:size(CData,1)
if ~isempty(CE{k1})
k2 = k2+1;
CD(k2,:) = CData(k1,:);
end
end
[R, P] = corrcoef(cell2mat(CD))
It works, but I’m sure there’s a more efficient way to do it.
Thank you again, Star Strider!

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

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

Start Hunting!