在MATLAB中搜索大型矩阵的更有效方法?

时间:2017-08-03 13:37:35

标签: matlab matrix

我有一个代码可以做我想要的但是它太慢了,因为我有一个非常大的mat文件和一个矩阵(33千兆字节),我需要搜索特定值并提取它们。

我正在搜索的文件具有以下结构:

reporter    sector  partner year    ave        
 USA        all     CAN     2007    0.060026126 
 USA        all     CAN     2011    0.0637898418
...

这会持续数百万行。我想提取特定报告者的最后一个(第5个)列值和partner值(扇区和年份是固定的)。实际上,为了简单起见,我已经采用了更多的固定值,但这可能会使我的代码更慢。由于这个原因,country_codespartner值需要变化并循环。

我的代码的关键部分如下:

for i = 1:length(country_codes)
    for g = [1:length(partner)]  
        matrix(i,g) = big_file(...
            ismember(GTAP_data(:,1), country_codes(i)) & ... % reporter
            ismember(GTAP_data(:,2), 'all') & ...sector
            ismember(GTAP_data(:,3), partner(g)) & ...  partner
            ismember([GTAP_data{:,4}]', 2011) & ... year
            ,5); % ave column     
    end
end

换句话说,代码遍历百万行,并通过在所有内容上应用ismember和逻辑&来找到正确的值。

有没有比使用ismember更快的方法?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

所以我看到的是你用不同文件中的数据构建一个大表。

您的值似乎是基于文本的。这会占用更多内存。 “USA”已经占用了三个字节的内存。如果你有少于255个国家的concider,你可以将它们只存储为uint8格式的一个字节。

如果您可以将所有列存储为0到255之间的值,则可以生成一个可以非常快速地编入索引的uint8矩阵。

举个例子:

%demo
GTAP_regions={'USA','NL','USA','USA','NL','GB','NL','USA','Korea Republic of','GB','NL','USA','Korea Republic of'};
S=whos('GTAP_regions');
S.bytes

GTAP_regions需要1580个字节。现在我们转换它。

GTAP_regions_list=GTAP_regions(1);
GTAP_regions_uint=uint8(1);
for ct = 2:length(GTAP_regions)
    I=ismember(GTAP_regions_list,GTAP_regions(ct));
    if ~any(I)
        GTAP_regions_list(end+1)=GTAP_regions(ct);
    else
        GTAP_regions_uint(end+1)=uint8(find(I));
    end
end

S=whos('GTAP_regions_list');
S.bytes
S=whos('GTAP_regions_uint');
S.bytes

GTAP_regions_uint我们需要用来做索引,现在只有10个字节,分析速度非常快。

GTAP_regions_list我们需要用来查找哪个索引值属于哪个国家,只有496个字节。

您还可以根据年份范围为行业,合作伙伴和年份执行此操作。如果它不超过255年,它将起作用。否则,您可以将其存储为uint16并具有65535个可能的选项。