【问题标题】:How can I make my index function faster?如何使我的索引函数更快?
【发布时间】:2015-07-16 02:48:25
【问题描述】:

因此,给定一个结构数组 Index,其中包含字段、Word、文档、位置,它需要一个 char 数组的单元数组并将其索引到 Index 中,并记录索引出现的文档的 DocNums。

function Index = InsertDoc(Index, newDoc, DocNum)
    for i = 1:numel(newDoc) 
        contains = any(strcmpi(newDoc(i),[Index.Word]));
        if any(contains);
            curr = find(strcmpi(newDoc(i),[Index.Word]),true);
            Index(curr).Documents{1} = unique([Index(curr).Documents{1},DocNum]);
            if (numel(Index(curr).Documents{1}) ~= numel(Index(curr).Locations))
                Index(curr).Locations{end+1} = [i];
            else
                Index(curr).Locations{end} = [Index(curr).Locations{end},i];
            end

        else 
            curr = numel(Index) + 1;
            Index(curr).Word = [newDoc(i)];
            Index(curr).Documents = {DocNum};
            Index(curr).Locations = {[i]};
        end
    end
end

例如

Doc1 = {'Matlab', 'is', 'awesome'};
Doc2 = {'Programming', 'is', 'very', 'very', 'fun'};
Doc3 = {'I', 'love', 'Matlab','very','much};

someIndex = InitializeIndex;
% InitializeIndex just creates struct array with the given fields and empty cell arrays
someIndex = InsertDoc(someIndex, Doc1, 1);
someIndex = InsertDoc(someIndex, Doc2, 2);
someIndex = InsertDoc(someIndex, Doc3, 3);

结果将是 一些索引(1)

Word: 'Matlab'
Documents: [1 3]
Locations: {[1] [3]}

someIndex(2)

Word: 'is'
Documents: [1 2]
Locations: {[2] [2]}

someIndex(5)

Word: 'very'
Documents: [2 3]
Locations: {[3 4] [4]}

我需要能够使用包含 20000 个元素和各种单词的结构数组来运行它,而现在完成索引需要花费大量的时间。我该如何改进这个算法?

【问题讨论】:

  • 使用内置分析器来确定哪些函数花费的时间最多;然后你就会知道要定位代码的哪些部分。

标签: arrays matlab indexing struct cell


【解决方案1】:

在循环开始之前尝试allocate memory 为您的元胞数组“Index”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2021-04-03
    • 2011-10-12
    • 1970-01-01
    • 2012-02-19
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多