如何在相对较短的时间内执行循环?

时间:2016-05-19 13:35:15

标签: matlab loops

执行循环就像永远(超过6小时)一样。我变量的大小是;

Z = 2041211元素

距离= 2021x2021双

SpannableString spannableString = new SpannableString("text");
spannableString.setSpan(
    new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Toast.makeText(getContext(), "Click!", Toast.LENGTH_LONG).show();
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(getResources().getColor(R.color.link));
        }
    }, 0, 4, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

textView.setText(spannableString);

textView.setMovementMethod(LinkMovementMethod.getInstance());

我是否正在使用大型文件,以便我获得的执行时间正常或者我有什么遗失。

感谢。 卡尔。

1 个答案:

答案 0 :(得分:1)

解释长执行时间

我不会说您遇到的长运行时的原因是您正在操作的矩阵的大小本身。相反,它是在for循环内的每行代码中执行的过多迭代次数。除了for循环的2,041,211次迭代之外,您只在第一行代码中执行2021^2 = 4084441次迭代!当然,更大的数据集总是需要更长的时间来处理...但很少有几个小时(除非您正在解析大块非结构化文本或大量MB大型组织不良的XML文件)。

诊断真正的罪魁祸首

内存效率

最简单的解决方案是弄清楚您当前使用的计算机RAM的数量。如果Matlab没有足够的内存可以使用,它的执行速度会比平时慢得多 - 维护Matlab文档的人也非常了解memory problems many Matlab users experience。在运行代码之前,运行clear命令以确保没有未使用的数据占用内存中的宝贵空间可能是有益的。

使用Profiler工具!

以上所有内容都是我最好的猜测,因为导致系统运行的速度如此之慢。如果您有兴趣自己确定代码中需要花费最多时间执行的特定函数,请使用Matlab内置的profile命令。要启动探查器,只需在代码的第一行插入行profile on即可。要查看探查器的结果,只需插入行profile viewer即可。我在下面提供的代码片段中说明了这一点。这将打开一个单独的图,其中概述了代码中每个函数执行的时间,并且根据这些信息,您可以了解这需要花费多长时间。

我建议使用更小的数据样本来测试它。您可以仅使用DistanceResidual_Squared数组的前100个值来测试它,只是为了查看哪些函数执行时间最长,而不必等待整个6小时的执行时间(即使是主戒指马拉松不能占用你太多的那些跑步。)

提高代码的性能

我认为您可以通过两个简单的步骤显着减少在此代码中执行的计算次数。首先,只需要执行尽可能多的计算:来自(Distance_Unique(duidx)==Distance)循环中第一行代码的for和来自循环中第二行代码的(Distance(:)== Distance_Unique(duidx)只需要如果我正确地阅读这些条件陈述的目的,那么就做一次。其次,只需使用内置函数(如findismember)执行操作,您当前通过条件语句执行强制执行操作。

例如,第一行代码的目标似乎是找到Distance中等于特定值Distance_Unique的所有索引。然后,将Residual_Squared中这些指数的所有值加在一起。您可以将其替换为此,利用findismember等功能执行相同的操作:

profile on

% Declare 'Distance', 'Unique_Distance', 'Residual Squared' matrices here

Z = length(Distance_Unique);
% Preallocate the arrays that store results to speed things up a little more
Summation_Residual_Squared = zeros(Z, 1);
Semivariance = zeros(Z, 1);

for idx = 1:Z
    % Your 1st line of code
    inds = find(ismember(Distance(:), Distance_Unique(idx))); % Find indices of all hits of current value of Distance_Unique in Distance matrix
    Residual_Squared_Array = Residual_Squared(:); 
    Summation_Residual_Squared(idx) = sum(Residual_Squared_Array(inds));

    % Your 2nd line of code
    num_hits = length(inds); % Number of times a given member of Distance_Unique array shows up in the Distance matrix
    Semivariance(idx) = Summation_Residual_Squared(idx) / (2 * num_hits); % You already know the total count of the given member of Distance_Unique because you can access the length of 'inds'
end

profile viewer

根据我的经验,Matlab的内置函数比条件语句中写出的任何快速逻辑更有效(因此执行操作的速度更快)。此外,将代码分解为整体的较小步骤,可以更轻松地查看如何使用已经处理过的数据(如我在上面提供的代码段中所示)。

我希望这些建议可以帮助你,快乐编码!