簡體   English   中英

MATLAB:使用文本掃描並在矩陣中轉換單元格數組

[英]MATLAB: Using textscan and converting cell array in matrix

我有一個大的csv文件(應該是大約100萬行),其中包含具有以下結構的選項數據(內容被更改):

secid, date, days, delta, impl_volatility, impl_strike, impl_premium, dispersion, cp_flag, ticker, index_flag, industry_group
100000, 02/05/1986, 60, -80, 0.270556, 74.2511, 5.2415, 0.021514, C, ASC, 0, 481
100000, 03/05/1986, 30, -40, 0.251556, 74.2571, 6.2415, 0.025524, P, ASC, 0, 481

我使用以下方法成功導入了測試文件:

ftest = fopen('test.csv');
C = textscan(ftest,'%f %s %f %f %f %f %f %f %s %s %f %f','Headerlines',1,'Delimiter',',');
fclose(ftest);

但是,C是一個單元格數組,這使得在matlab中處理文件內容變得更加困難。 將它作為“常規”數組更容易(原諒我不知道正確的命名法,我剛開始使用matlab)。

如果我輸出C,我得到:

Columns 1 through 6
[2x1 double]    {2x1 cell}    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]
Columns 7 through 12
[2x1 double]    [2x1 double]    {2x1 cell}    {2x1 cell}    [2x1 double]    [2x1 double]

因此在C單元格數組中,有數組和單元格數組 - 數字數組和字符串數組。 如果我嘗試檢查元素(1,2),我必須使用C {1}(2),但如果我想檢查元素(2,2),我必須使用C {2} {2}。 理想情況下,我想同時訪問C(1,2)和C(2,2)。 問題是,我該怎么做?

我已經搜索了解決方案並找到了cells2mat,但只有當所有內容都是數字時(我認為)它才有效。 我找到了這個解決方案: 將單元格數組的單元格數組轉換為矩陣矩陣,但是horzcat檢索錯誤,我認為可能由於同樣的問題而發生錯誤。

提前謝謝您的時間。

由於你有一個包含數字和字符數據的數組,你想要的是不可能的(相信我,它也是不切實際的)。

引用數字數組中的單個數字與引用整個字符串不同。 根本就沒有逃避,也不應該:你對待鮮花與對待人們的方式不同(我當然希望如此)。

在MATLAB中,字符串是普通數組,不同之處在於數組的每個條目都不代表數字,而是字符。 引用單個字符與引用數組中的數字相同:

>> a = 'my string'
>> a(4)
ans = 
s
>> a+0  % cast to double to show the "true character" of strings
ans =
    109   121    32   115   116   114   105   110   103

然而, textscan假設(理應如此),你不想 ,而是要提取文件整個字符串 並且應該以不同的方式引用整個字符串,以表示您指的是整個字符串而不是單個字符。

如果你將textscan的結果分成普通的數字數組和字符串的單元格數組,我認為你會發現它更直觀一些,如下所示:

% load the data
ftest = fopen('test.csv');
C = textscan(ftest,...
    '%f %s %f %f %f %f %f %f %s %s %f %f',...     
    'collectoutput', true,...
    'Delimiter',',\n');
fclose(ftest);

% split into numeric and char arrays
numeric = [C{[1 3 5]}]
alpha   = [C{[2 4]}]

numeric引用數據然后遵循與任何普通數組相同的規則,並引用alpha的字符串,然后遵循正常的單元格引用規則(如在alpha{2,1}中獲取'03/05/1986'

編輯基於沒有您的意見,您想要進行如下轉換:

% Read the data
fid = fopen('test.csv', 'r');
C = textscan(fid,...
    '%f %s %f %f %f %f %f %f %s %s %f %f',...
    'Headerlines', 1,...
    'Delimiter',',');
fclose(fid);

% Delete 10th element ('ASC')
C(10) = [];

% Mass-convert dates to datenums
C{2} = datenum(C{2}, 'dd/mm/yyyy');

% Map 'P' to 1 and 'C' to 2
map('PC') = [1 2];
C{9} = map([C{9}{:}]).';

% Convert whole array to numeric array
C = [C{:}];

我遇到了同樣的問題...我更喜歡使用2-D單元陣列以便於訪問並使用內置的matlab排序功能。

這是另一個可能適合您的解決方案(這是TMW在導入工具中的自動生成代碼中執行此操作的方式)。 它將數值數組轉換為單元格數組,以便您可以將它們連接成2-D矩陣。

C([1,3,4,5,6,7,8,11,12]) = cellfun(@(x) num2cell(x), C([1,3,4,5,6,7,8,11,12]),'UniformOutput', false);

C = [C{1:end}];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM