2012-01-10 179 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