【问题标题】:Matlab: optimize codeMatlab:优化代码
【发布时间】:2015-12-10 16:04:15
【问题描述】:

问题: 我有 14 个用户的轨迹:我比较了每个用户的轨迹,对于每个用户,我计算了最长的公共序列:TrajSimilarity(1,k).aLongestString。现在我想比较第一个用户与其他用户的最长公共序列,第二个用户与其他用户的最长公共序列等等。

使用这段代码比较两个用户的最长公共序列没有问题:

string3=TrajSimilarity(1,3).aLongestString;
string4=TrajSimilarity(1,4).aLongestString;
[D,dist,aLongestString]=LCS(string3,string4);

U=numel(regexp(string3,'(\(\d+\)|\d)'));
V=numel(regexp(string4,'(\(\d+\)|\d)'));
nLCS=numel(regexp(aLongestString,'(\(\d+\)|\d)'));

ratioU=nLCS/U;
ratioV=nLCS/V;

EA = (ratioU + ratioV)/2;
WA = (U*ratioU+V*ratioV)/(U+V);

LCS 是一个计算两个字符串之间最长公共子字符串的函数(如果有帮助,我会发布一个链接)。 我在创建优化代码时遇到问题,该代码将第一个用户的最长公共序列与其他用户进行比较,第二个用户的最长公共序列与其他用户进行比较等等。 我试试这段代码:

for k=1:14
   string3=TrajSimilarity(1,k).aLongestString;
    for j=2:14
        string4=TrajSimilarity(1,j).aLongestString;
        [A(j,k).D,A(j,k).dist,A(j,k).aLongestString]=LCS(string3,string4);
    end
end

但它会产生错误:

Attempted to access L(0,0); index must be a positive integer or
logical.

Error in LCS (line 52)
dist = L(n,m);

你能帮帮我吗?谢谢

【问题讨论】:

  • 尝试打印一些调试信息,或者使用调试器单步执行代码。我猜你的一些字符串是空的?另请注意,除了 k=1 之外,您将每个与自身进行比较(2 和 2、3 和 3 等)
  • 你有理由:有空字符串会产生错误;我有正确的代码消除它们,它工作正常。

标签: matlab optimization


【解决方案1】:

正确的代码是:

% Similarity between two users
for k=1:14
    % string3 e string4 must be > 1
    string3=TrajSimilarity(1,k).aLongestString;
    for j=2:14
        string4=TrajSimilarity(1,j).aLongestString;
        % entrambe le variabili temporanee devono essere non vuote per
        % poter essere confrontate
        if (~isempty(string3))&&(~isempty(string4))
            % calculate distance and a longest string
            [A(j,k).D,A(j,k).dist,A(j,k).aLongestString]=LCS(string3,string4);

            U=numel(regexp(string3,'(\(\d+\)|\d)'));
            V=numel(regexp(string4,'(\(\d+\)|\d)'));
            A(j,k).nLCS=numel(regexp(A(j,k).aLongestString,'(\(\d+\)|\d)'));

            A(j,k).ratioU=A(j,k).nLCS/U;
            A(j,k).ratioV=A(j,k).nLCS/V;

            A(j,k).EA = (A(j,k).ratioU + A(j,k).ratioV)/2;
            A(j,k).WA = (U*A(j,k).ratioU+V*A(j,k).ratioV)/(U+V);

        end
    end
end

该代码仅在 string3 和 string4 >1 时才有效,并且不会产生错误。

【讨论】:

  • 很高兴您找到了解决方案;我猜你可以接受你自己的答案。请注意,对于 k=2, j=2,您有 string3==string4,同样对于 k=3,4..14
  • 是的,我知道。我正在寻找解决方案:我希望解决它!
  • 如果您想跳过相等的字符串索引,您只需在比较之前检查j 是否与k 不同。
  • 例如if (~isempty(string3))&&(~isempty(string4)) && j~=k
猜你喜欢
  • 2011-11-30
  • 2011-11-03
  • 2013-11-12
  • 2016-10-21
  • 2018-03-14
  • 2013-05-01
  • 2012-10-05
  • 2019-05-31
  • 2011-11-03
相关资源
最近更新 更多