【发布时间】:2013-10-21 22:26:38
【问题描述】:
我正在尝试分析大量数据,这些数据使我的程序运行缓慢。 我正在将数据集从 .txt 文件读取到元胞数组。 我正在使用一个单元格数组来对我的数据进行分类,它是两个属性的形式,我需要字符类。
我想使用最接近的平均分类器找到重新替换错误。 我有一个主要的外循环,它遍历我的数据集的每一行(数万行)。依次删除每一行,每次迭代一个。每次迭代都会重新计算两个属性的平均值,并删除线。主要的挂点似乎是我要计算数据集中每一行的下一部分:
- 该行数据(2 个属性值)与 我每个班级的平均值。
- 然后我想记录其属性平均值最接近的类,这将是其分配的类。
- 最后我想检查这个分配的类是否正确 类。
目前这个循环是这样的。
errorCount = 0;
for l = 1:20000
closest = 100;
class = 0;
attribute1 = d{2}(l);
attribute2 = d{3}(l);
for m = 1:numel(classes)
dist = sqrt((attribute1-meansattr1(m))*(attribute1-meansattr1(m)) + (attribute2-meansattr2(m))*(attribute2-meansattr2(m)));
if dist < closest
closest = dist;
class = m;
end
end
if strcmp(d{1}(l),classes(class))
%correct
else
errorCount = errorCount + 1;
end
end
d 是我的单元格数组,其中d{2} 是包含我的属性 1 值的列。对于该列的第一行,我使用 d{1}(1) 访问这些值。
classes 是我数据集中的唯一类,因此对于我的每个类,我都会计算到它的欧几里得距离。
meansattr1 和 meansattr2 是包含我的每个属性的平均值的数组。当删除一行时,这些在外部循环的每次迭代中都会更新。
希望这可以帮助您理解我拥有的代码。非常感谢在优化和加速这些计算方面的任何帮助。
【问题讨论】:
-
最简单的速度改进是删除
sqrt调用。找到最近距离的平方与最近距离完全相同。
标签: performance matlab vectorization nested-loops