我在Matlab中解析数据文件来绘制它。我解析的数据有3列:用parfor填充地图
category | x | y
该文件可能有任何类别的几个点。为了将它们组合在一起并获得正确的图例,我需要对数据进行排序,以便每个类别生成一个n x 2
矩阵,它表示给定类别中的n
点。
在下面的摘录中,不用担心解析,而是重要的部分是如何添加地图。 category
是关键,而newVal
是单个x-y对值,需要连接到该点的矩阵。
disp('Sorting categories...')
map = containers.Map();
for i = 2:size(data,2)
str = strsplit(data{i}, '\t');
category = strsplit(str{1}, '.');
category = category{1};
newVal=sscanf([str{2} ',' str{3}],'%f,%f')';
%Interesting stuff starts here
if(isKey(map, category))
mapVal = [map(category); newVal];
else
mapVal = newVal;
end
map = [map; containers.Map(category, mapVal)];
end
这需要有59K点的时间太长了,我真的想给for
变成parfor
。我的过程需要在map
变量上进行读 - 修改 - 写操作,这是行不通的。我想代码做这样的事情,而不是(假设它会更快,这可能不是真的反正):
disp('Sorting categories...')
map = containers.Map();
for i = 2:size(data,2)
str = strsplit(data{i}, '\t');
category = strsplit(str{1}, '.');
category = category{1};
newVal=sscanf([str{2} ',' str{3}],'%f,%f')';
maps{i} = containers.Map(category, mapVal);
end
map = [maps{:}];
然而,在Matlab串联地图导致被覆盖,而不是附加价值。这将导致每个类别仅保留该类别的最后解析点。有没有办法避免这种行为?
我认为使用'map(category)= mapVal;'代替'map = [map; containers.Map(category,mapVal)];'在你提供的第一个代码中。 – Marcin 2014-10-02 23:37:22
@Marcin是的,现在你提到它了,是不是我认为大声笑 – Suedocode 2014-10-03 16:24:45