Преобразовать неоднородный массив ячеек в числовой массив - PullRequest
5 голосов
/ 22 декабря 2011

Я использую xlsread в MATLAB для чтения листов из файла Excel.Моя цель состоит в том, чтобы каждый столбец таблицы Excel читался как числовой массив.В одной из колонок есть комбинация цифр и цифр + символ.Например, значения могут быть 200, 300A, 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 в 46

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

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

Ответы [ 2 ]

7 голосов
/ 22 декабря 2011

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

[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
2 голосов
/ 22 декабря 2011

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

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

Шаги, которые вы должны выполнить, чтобы преобразовать записи строк в числовые значения:

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

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...