2011-12-22 64 views
5

我在MATLAB中使用xlsread從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 at 46

輸入單元格數組的所有內容必須是相同的數據類型。

我覺得我可能在某處混淆了()和{}。有人可以幫我解決這個問題嗎?

+0

變量'alt'是什麼?應該是'myCol'嗎? – gnovice 2011-12-22 19:28:01

+0

哎呀抱歉。是的,應該是。我編輯它。 – Doomchinchilla 2011-12-22 19:36:48

回答

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 2011-12-22 19:53:24

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