在matlab中有效地加载大量数据

时间:2013-12-16 03:16:38

标签: matlab memory

我有以下格式设置的百万行数据

User Gameid Count
A  1  2
A  2  3
A  10 2
A  8 2
B 10 2
B 1 6

....

我想从中创建一个稀疏矩阵,每行代表一个用户,代表gameid的列和每个单元格中的值是相应用户和gameid的计数。

矩阵稀疏。所以它应该由matlab处理。

如何在不迭代每行的情况下直接加载此类数据,这将耗费大量时间。有任何建议如何有效地做到这一点?

这就是我想要的

Column 1 2 3 4 5 6 7 8 9 10
       2 3           2    2
       6                  2

2 个答案:

答案 0 :(得分:1)

好的,你的文件是file.txt

好的,通过简单的操作,你可以得到你想要的东西:

clear all
close all

fil = 'file.txt';

fid = fopen(fil,'r');

s = textscan(fid,'%s','Delimiter','\n');
s = s{1};
s = s(2:end);

ls = length(s);

fmat = '%s %u %u';

C = sscanf(char(s)',fmat); 
C = reshape(C,[3 length(s)])';
A = char(C(:,1));
data = cellstr(A);
data(:,2:3) = num2cell(C(:,2:3));

Users = unique(A);

S_MAT_DATA = spalloc(length(Users),max(C(:,2)),round(ls/length(Users))+1);

nmat = 1;

for aa = 1:length(Users)
    data_user = cell2mat(data(strncmp(Users(aa),data(:,1),1),2:3)');
    S_MAT_DATA(aa,data_user(1,:)) = data_user(2,:);
end

答案 1 :(得分:1)

我认为您可以使用textscan

fid = fopen(file);
content = textscan(fid, '%s%d%d');

user = content{1}; % cell
field = content{2}; % vector
count = content{3}; % vector