2011-12-22 12 views
5

Estoy usando xlsread en MATLAB para leer en hojas de un archivo de Excel. Mi objetivo es que cada columna de la hoja de Excel se lea como una matriz numérica. Una de las columnas tiene una combinación de números y números + char. Por ejemplo, los valores podrían ser 200, 300A, 450, 500A, 200A, 100. esto es lo que tengo hasta ahora:Convertir matriz de celdas no uniforme en matriz numérica

[num, txt, raw] = xlsread(fileIn, sheets{ii}); % Reading in each sheet from a for loop 
myCol = raw(:, 4)        % I want all rows of column 4 
for kk=1:numel(myCol) 
     if iscellstr(myCol(kk)) 
      myCol(kk) = (cellfun(@(x)strrep(x, 'A', ''), myCol(kk), 'UniformOutput', false)); 
     end 
end 

myCol = cell2mat(myCol); 

Ésta es capaz de quitarse la carbonilla del número, pero entonces me quedo con

mycol =

[200]

'300'

[450]

'500'

'200'

[100]

que los errores hacia fuera en cell2mat con:

cell2mat (mycol)

??? Error al utilizar ==> cell2mat en 46

Todos los contenidos de la matriz de celdas de entrada deben ser del mismo tipo de datos.

Siento que probablemente estoy confundiendo() y {} en alguna parte. ¿Alguien me puede ayudar con esto?

+0

¿Cuál es la variable 'alt'? ¿Debería ser 'myCol'? – gnovice

+0

Whoops lo siento. Sí, debería ser. Lo edité – Doomchinchilla

Respuesta

7

Empezaré de la lectura del archivo

[num, txt, raw] = xlsread('test.xlsx'); 
myCol = raw(:, 4); 

idx = cellfun(@ischar,myCol); %# find strings 
data = zeros(size(myCol)); %# preallocate matrix for numeric data 
data(~idx) = cell2mat(myCol(~idx)); %# convert numeric data 
data(idx) = str2double(regexprep(myCol(idx),'\D','')); %# remove non-digits and convert to numeric 
+0

Esto funcionó muy bien. ¡Gracias! – Doomchinchilla

2

La variable myCol es inicialmente una serie de células que contienen tanto números como cadenas, algo como esto en su ejemplo:

myCol = {200; '300A'; 450; '500A'; '200A'; 100}; 

los pasos que ha a seguir para convertir las entradas de cadena en valores numéricos es:

  1. Identifique las entradas de celda en myCol que son cadenas. Se puede utilizar un bucle para hacer esto, como en el ejemplo, o puede utilizar la función de CELLFUN para obtener una logical index así:

    index = cellfun(@ischar,myCol); 
    
  2. quitar las letras. Si conoces las letras para eliminar siempre será 'A', como en el ejemplo, se puede utilizar una función simple como STRREP en todas sus células indexados así:

    strrep(myCol(index),'A','') 
    

    Si se puede tener todo tipo de otros personajes y letras en la cadena, entonces una función como REGEXPREP puede funcionar mejor para usted. Para su ejemplo, se puede hacer esto:

    regexprep(myCol(index),'\D','') 
    
  3. convertir las cadenas de números a valores numéricos.Usted puede hacer esto para todas sus células indexado utilizando la función STR2DOUBLE:

    str2double(regexprep(myCol(index),'\D','')) 
    

El resultado final de lo anterior, entonces se puede combinar con los valores numéricos originales en myCol. Poniendo todo junto, obtendrá lo siguiente:

>> index = cellfun(@ischar,myCol); 
>> result(index,1) = str2double(regexprep(myCol(index),'\D','')); 
>> result(~index) = [myCol{~index}] 

result = 

    200 
    300 
    450 
    500 
    200 
    100 
Cuestiones relacionadas