2013-12-17 67 views
3

我有以下形式的數據在一個文本文件有效地加載數據在MATLAB

Userid Gameid Count 
Jason 1  2 
Jason 2  10 
Jason 4  20 
Mark 1  2 
Mark 2  10 
................ 
................. 

總共有81個Gameids的,我有200萬左右的不同用戶。

我要的是讀取該文本文件並創建表單的稀疏矩陣

 Column 1 2 3 4 5 6 . 
Row1 Jason 2 10 20 
Row2 Mark 2 10 

現在我可以加載在MATLAB這個文本文件並讀取用戶一個接一個,閱讀他們的數量和初始化稀疏數組。我已經試過了,初始化一個用戶的行需要1秒。所以對於總共200萬用戶來說,這需要我很多時間。

什麼是最有效的方法來做到這一點?

這裏是我的代碼

data = sparse(10000000, num_games); 
loc = 1; 

for f=1:length(files) 
    file = files(f).name; 

    fid = fopen(file,'r'); 

    s = textscan(fid,'%s%d%d'); 

    count = (s(:,2)); 
    count = count{1}; 
    position = (s(:,3)); 
    position = position{1}; 

    A=s{:,1}; 
    A=cellstr(A); 

    users = unique(A); 

    for aa = 1:length(Users) 
     a = strfind(A, char(Users(aa))); 
     ix=cellfun('isempty',a); 
     index = find(ix==0); 
     data(loc,position(index,:)) = count(index,:); 
     loc = loc + 1; 
    end 
end 
+0

我不知道你希望你的稀疏矩陣看起來像。你想要它包含值*和*球員姓名字符串?或者,您是否想爲每個玩家創建一個稀疏矩陣? –

回答

2
  • 使用unique更加爲GameID避免內循環。
  • 存儲用戶名稱,因爲在您的原始代碼中,無法確定哪個名稱 - 與每行相關。遊戲ID也是一樣。
  • 確保在打開文件後關閉文件。
  • sparse矩陣不支持'int32'您需要將數據存儲爲double

% Place holders for Count 
Rows = []; 
Cols = []; 

for f = 1:length(files) 
    % Read the data into 's' 
    fid = fopen(files(f).name,'r'); 
    s = textscan(fid,'%s%f%f'); 
    fclose(fid); 

    % Spread the data 
    [U, G, Count{f}] = s{:}; 

    [Users{f},~, r] = unique(U); % Unique user names 
    [GameIDs{f},~,c] = unique(G); % Unique GameIDs 

    Rows = [Rows; r + max([Rows; 0])]; 
    Cols = [Cols; c + max([Cols; 0])]; 
end 

% Convert to linear vectors 
Count = cell2mat(Count'); 
Users = reshape([Users{:}], [], 1); 
GameIDs = cell2mat(GameIDs'); 

% Create the sparse matrix 
Data = sparse(Rows, Cols, Count, length(Users), length(GameIDs), length(Count)); 

Users將包含成爲行標題(用戶名)和GameIDs列標題