check cell's contents and convert to matrix

i have a data cell as below:
when i use
param1=cell2mat(data(:,2));
param2=cell2mat(data(:,6));
param3=cell2mat(data(:,7));
it gives error:
??? Error using ==> cell2mat at 47
All contents of the input cell array must be of the same data type.
So, every time there is a string in cell matrix MATLAB Gives error and i correct it by hand.
Is there a method that makes this:
param1=cell2mat(data(:,2));
If one of the members of cell is string, than assign that to value of zero??
Thank you very much

5 Commenti

I do not see a picture at the shown link.
An example could be helpful, e.g. {1,2,3,'String'} ?
I didn't either at first, but then realized it was the table towards the top right.
I tried it again without success. I see some GUI objects, "Images You'll also enjoy", some Tools on the left bottom. After I hit the "Next" button, a picture of a male human appeared in frontal plane - without cloths. I'm not sure if this should encourage me to disable the NoScript filter...
I do not find a table and I do think that TinyPic is junk.
For me it appears in the section underneath "click to add tags". I had to temporarily allow tinypic.com but I did not have to allow any of the other sites the page wants (photobucket, gigya, z25, or others.)
http://oi56.tinypic.com/33ylu1z.jpg
should be the direct link.
Thanks Walter! Following your link I can see the table without any tricks. This is another argument to host pictures on a Mathworks server.

Accedi per commentare.

 Risposta accettata

The following code will find any strings in your input data and replace them with NaN values then converts the cell array to a matrix. You can use any value to replace the strings... it's just that NaN may be appropriate for this case.
c = { 1; 2 ; 3 ; 'aa ' ; 4 ; 10 ; ' '};
ival = cellfun(@ischar,c)
c(ival) = {NaN}
b = cell2mat(c)

1 Commento

The OP asked for zeros explicitely. CELLFUN(@ischar, C) and CELLFUN('isclass', C, 'char') is equivalent.

Accedi per commentare.

Più risposte (6)

param1 = cellfun(@(c) isnumeric(c) * c(1),data(:,2))
idx = find(cellfun('isclass',data,'char'));
data(idx) = data(idx-1)

1 Commento

Close, but that won't work if there are several strings in a row.

Accedi per commentare.

ben harper
ben harper il 28 Mag 2011
Thank you for answers.. What if i try to change the string cell to the prvious cell's value, not zero??
I mean
for i=1:size(data,1)
if data(i,2) is string
data(i,2)=data(i-1,2)
end
end
convert column to array with cell2mat
----------
Like this picture:
I wrote a solution as below: Can you recommend me if you know a shorter solution. Because in my code i must do this multiple times. Thank you all.
indices=cellfun('isclass', data(:,2), 'char');
for i=1:size(indices,1)
if indices(i)==1
if i>1
data(i,2)=data(i-1,2);
elseif i==1
data(i,2)=data(i+1,2);
end
end
end
data_new=cell2mat(data(:,2));
Are you guaranteed that there will not be two adjacent string values in the input matrix?
If so, then this should work for you:
if indices(1)
data(1,2) = data(2,2);
indices(1) = 0;
end
data(indices) = data([indices(2:end) 0]);

Categorie

Community Treasure Hunt

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

Start Hunting!

Translated by