2013-11-28 35 views
-2

我有一個簡單的問題,我對matlab很新,所以我在實現它時遇到了問題我有兩個64x2矩陣u和hi必須檢查u中的單個行是不是等於h中的所有行,那麼不相等的行應該保存在一個單獨的矩陣中,同時我寫了這段代碼,但它做的是r(i,:)得到u(i, :)當這段代碼運行時,我想要的是隻有那些u(i,:)的值應該存儲在r中,它們與h矩陣中的任何行都不相似。在matlab中實現「不等於」循環

h=[]; 
for j=1:8 
    for i=1:8 
     h=[h; i j]; 
    end 
end 
u=[5.3,1.4;6,8;2,3;3,5.5;2.6,8;3.7,2;4,2;5,3;1.9,8;5.4,4;3.2,3;2,2;2,4;2,3;8,2.2;8,4;7.3,1.5;6.2,5.1;2.4,1.5;3,5;2,7.1;1.8,2.7;3,4;6,5;6,1;5,4;4,6;3.5,2;5,7;7.2,8;7,7;5,5;6,3;6,6;1,2;5,8;3,5;1,5;2,2;2,1;6,3;4,7;6,8;3,6;1,6;5,2;3,5;8,7;8,4;4,8;1,1;6,3;7,5;8,1;1,6;4,5;5,5;6,7;6,7;6,7;6,3;3,4;5,7;1,1] 
for i=1 
    for j=1:64 
    if u(i,:)==h(j,:) 
c=1 
    else 
     c=0 
     if c==0 
       r(i,:)=u(i,:) 
     end 
    end 
    end 
end 

誰能幫助我,請

+0

我試圖用另一個循環使用不等於u(i,:)〜= h(j,:)但不能給出更好的結果ts –

+1

'if'語句中的條件應該是標量。使用'all(u(i,:)== h(j,:))'或'isequal(u(i,:),h(j,:)' – Mikhail

+0

我已經嘗試了,但它給出了相同的答案,我在r矩陣中得到了u的所有值,而我只需要那些不存在於h矩陣中的u值 –

回答

1

你可以用ismember做到在一個行:

r = u(~ismember(u,h,'rows'),:); 

有了您的數據。例如,結果是

>> r  
r = 
    5.3000 1.4000 
    3.0000 5.5000 
    2.6000 8.0000 
    3.7000 2.0000 
    1.9000 8.0000 
    5.4000 4.0000 
    3.2000 3.0000 
    8.0000 2.2000 
    7.3000 1.5000 
    6.2000 5.1000 
    2.4000 1.5000 
    2.0000 7.1000 
    1.8000 2.7000 
    3.5000 2.0000 
    7.2000 8.0000 
+0

謝謝你解決了我的問題 –

+0

@DuaMalik謝謝。在這種情況下,請將問題標記爲「接受」 –

1

使用setdiff'rows'選項計算r。請避免不必要的循環。儘可能預分配。

% construct h without loop 
[h{1} h{2}]=ndgrid(1:8,1:8); 
h=[h{1}(:) h{2}(:)]; 
% get r using setdiff 
r = setdiff(u, h, 'rows') 

結果與你

r = 
1.8000 2.7000 
1.9000 8.0000 
2.0000 7.1000 
2.4000 1.5000 
2.6000 8.0000 
3.0000 5.5000 
3.2000 3.0000 
3.5000 2.0000 
3.7000 2.0000 
5.3000 1.4000 
5.4000 4.0000 
6.2000 5.1000 
7.2000 8.0000 
7.3000 1.5000 
8.0000 2.2000 
+0

setdiff很不錯,雖然它具有複雜性NlogN! – user2987828

0

解在NlogN複雜問題(N = 64):

N=size(h,1); 
[husorted,origin_husorted,destination_hu]=unique([h;u],'rows','first'); 
iduplicates=destination_hu(N+1:end)<=destination_hu(N),:); 
r=u; 
r(iduplicates,:)=0; 

destination_uhunique唯一輸出是有用的;它驗證[h;u]=husorted(destination_uh,:)]'first'確保如果u的線ih的線j相等,則destination_uh(i+N)等於destination_uh(j)

解決方案爲您的特定小時,複雜N:

r=u; 
r(all(u==round(u)&u>=1&u<=8,2),:)=0;