2012-01-10 181 views
0

我有一个矩阵数组(M)。我对第i个位置上的矩阵执行一个操作,并在第(3i-1),(3i)和(3i + 1)个位置向我的数组添加三个矩阵。我想继续这个过程直到我到达数组中的第j个位置,其中j使得第(j + 1)个位置和之后的所有矩阵已经出现在位置1和j(包含)之间的某处。如何检查矩阵是否不在数组中(Matlab)

编辑:我被要求澄清我的意思。如上所述,我无法编写使我的算法终止的代码。如果我知道通过矩阵阵列搜索的正确方法来检查给定的矩阵是否包含,那么我可以做到这一点。我试过如下:

done = 0;  

ii = 1 

    while done ~= 1 

    %operation on matrix in ith position omitted, but this is where it goes 

     for jj = ii+1:numel(M) 

       for kk = 1:ii 
        if M{jj} == M{kk}; 
         done = done + 1/(numel(M) - ii); 
         break 
        end 
       end 
     end 

      if done ~= 1 
       done = 0; 
      end 

    ii = ii + 1 

    end 

我有这个(我敢肯定,你可以看到)的问题是,如果处理进行太久,舍入误差停止过做允许= 1,和算法不会终止。我试图让这一轮通过引入阈值,像

while abs(done - 1) > thresh 

if abs(done - 1) > thresh 
    done = 0; 
end 

这使得该算法的工作更多的时候,但我没有“一刀切”的阈值,我可以使用(该过程可以继续任意多个步骤),所以它仍然最终打破。

我能做些什么来解决这个问题?

感谢

+3

我不太明白问题的内容与问题标题的关系。请问你在问什么?另外,你能提供'M'来让你的代码可以正确重现。最后,如果你在MATLAB中有这样的嵌套循环,通常意味着你做错了什么。我建议你澄清你的真实目标,这样我们就可以找到更好的编写代码的方法。 – 2012-01-10 22:00:57

+0

感谢您的回复。我现在编辑我的帖子,使我的问题更清晰;我想你会发现它与标题有关。我不明白你的意思是“错误”。我的目标是编写一个算法,使我能够在可接受的时间内获得所需的输出。我是编程新手,但我写的其他大多数算法都使用嵌套循环,并且工作得很好。 – 2012-01-10 22:08:23

+0

我也不明白标题与你的要求有什么关系。如果将其更改为更相关的内容,例如“循环未正确终止”或其他内容会更好。它也会帮助你,因为感兴趣的人会根据标题真正阅读你的真实问题。 – Jorge 2012-01-11 01:03:19

回答

0

你为什么不初始化为0做,让你做的同时== 0环,取而代之的计算做作为元素的总和,检查你的条件(如果发现矩阵已经存在)已针对所有jj验证过,如下所示:

alldone=zeros(numel(M)-ii,1); 

for jj = ii+1:numel(M) 

     for kk = 1:ii 
      if isequal(M{jj},M{kk}) 
       alldone(jj-ii) = 1 
       break 
      end 
     end 
end 
done=prod(alldone); 

虽然可能有更优雅的代码编写方法。 例如,您可以添加提前终止:

while done==0 
done=1; 
for jj = ii+1:numel(M) 
    match_success=0; 
    for kk = 1:ii 
     if isequal(M{jj},M{kk}) 
      match_success=1; 
      break 
     end 
    end 
    if match_success==0 
     done=0; 
     break; 
    end 
end 
end 

在每个循环的开始,该算法假定它会成功,并停在那里(所以做= 1)。然后,对于每个jj,只有在找到M {jj}的匹配时,我们才会创建match_success,它将被设置为1。如果找到了比赛,我们休息并转到下一个j。如果找不到匹配的j,则match_success被保留为0,done被初始化为0并且while循环继续。我没有检查过,但我认为它应该可以工作。

这只是一个简单的调整,但再一次,更多的想法可能会加速这整个代码很多。

+0

谢谢。虽然我可以看出为什么这样更好,但在某些情况下它仍然不起作用。我添加了一个“disp(alldone)”,并且每个循环都生成了除1之外的所有内容。是否会出现浮点错误或isequal? – 2012-01-10 22:34:55

+1

你能否看看matlab决定的两个矩阵不等,但应该是?他们真的是一样的吗?如果它们大致相同,但在理论上相同(例如,如果matlab在计算每个错误时产生一个小错误,并且这导致不相等),则应该能够用基于容差的检查来替换该检查(像范数(M {jj} -M {kk})<一些小值)。 – Theo 2012-01-10 22:58:10

+0

刚才添加到上面的Richie的评论是,你可能会发现Matlab是一种相当慢的语言,除非你可以尽可能地避免嵌套循环并行化代码(即矩阵或数组操作)。有时候不清楚该怎么做,但是当你认为你的代码太慢的时候要记住一些事情。 – Theo 2012-01-10 23:02:32