2011-12-22 5 views
5

Я использую xlsread в MATLAB для чтения в листах из файла excel. Моя цель состоит в том, чтобы каждый столбец Excel был прочитан как числовой массив. В одном из столбцов есть сочетание чисел и чисел + char. Например, значения могут быть 200, 300А, 450, 500A, 200A, 100 вот что я до сих пор:Преобразование неоднородной матрицы ячеек в числовой массив

[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); 

Это может сдирать полукокс из числа, но тогда я оставил с

Mycol =

[200]

'300'

[450]

'500'

'200'

[100]

который ошибки вне на cell2mat с:

cell2mat (Mycol)

??? Ошибка при использовании ==> cell2mat at 46

Все содержимое массива входных ячеек должно быть одного типа данных.

Я чувствую, что я, вероятно, смешиваю() и {} где-то. Может ли кто-нибудь помочь мне с этим?

+0

Что такое переменная 'alt'? Должно ли это быть 'myCol'? – gnovice

+0

К сожалению. Да, должно быть. Я отредактировал его. – Doomchinchilla

ответ

7

Позвольте мне начать с чтения файла

[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

Это отлично работало. Благодаря! – Doomchinchilla

2

Переменная myCol изначально массив ячеек, содержащих числа и строки, что-то подобное в вашем примере:

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

ступеньках у вас есть для преобразования строковых записей в числовые значения:

  1. Определите записи ячеек в myCol, которые являются строками. Вы можете использовать цикл, чтобы сделать это, так как в вашем примере, или вы можете использовать функцию CELLFUN, чтобы получить logical index так:

    index = cellfun(@ischar,myCol); 
    
  2. Удалить буквы. Если вы знаете, буквы, чтобы удалить всегда будет 'A', как в вашем примере, вы можете использовать простую функцию, как STRREP на все ваши проиндексированные клетки следующим образом:

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

    Если вы можете иметь все виды других персонажей и буквы в строке, то функция, такая как REGEXPREP, может работать лучше для вас. Для примера, вы можете сделать это:

    regexprep(myCol(index),'\D','') 
    
  3. Преобразование строки чисел в числовые значения.Вы можете сделать это для всех ваших проиндексированных ячеек с помощью функции STR2DOUBLE:

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

Конечный результат выше, то можно комбинировать с исходными числовыми значениями в myCol. Собирая все это вместе, вы получаете следующее:

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

result = 

    200 
    300 
    450 
    500 
    200 
    100 
Смежные вопросы