2016-03-29 26 views
-1

Ben b her satır ile a karşılaştırarak, matrisin b veya olmayan bir satır dizisi a olmadığını kontrol etmek için Matlab kendi versiyonunu ismember (find_element) yazın. a'daki her öğe b'daki bir satırın her öğesine eşittir (mutlak hata Tol'dan küçükse), ardından mantıksal değer 1'i ve satır numarasını döndürür. Benim kod test ederken Matlab karşılaştırmasında bir hata mı?

Ancak, ben ( B b ikinci satırı olan) B=[-1 0] ile a=1.0e-11*[0.9063 0.0838] karşılaştırdığımızda Matlab t=[1 1] dönecektir bulmak. Aslında, error=[1.0000 0.0000] numaralı doğru mutlak hata verir ve açıkça error(1), Tol=1e-6'dan daha büyüktür. Matlab'da bir hata buldum mu? Yoksa kodumda bir hata var mı?

function [Lia,Locb] = find_element(a,b) 
%decide whether a is in b or not(compare each row); if in, return row number 
%INPUT: 
%a: salar or row array 
%b: column array or matrix 
%OUTPUT: 
%Lia: 1 if a is in b, 0 if not 
%Locb: location of a in b, row number if b is a matrix 
Tol = 1e-6; %set tolerance when compare elements 
Lia = 0;%initialization 
Locb = 0; 

t = zeros(size(a));%compare result of each element,logical array 
for i = 1:size(b,1) %loop through each row 
    for j = 1:size(b,2) %compare each element in each row 
     if abs(a(j)-b(i,j))<Tol 
      t(j) = 1; 
     end 
    end 
    if t %all 1's 
     Lia = 1;%find a in b 
     Locb = i;%return row number 
     %%%%%%%%%%%%%%%%%%%%%%%% 
     %test outputs 
     a 
     B=b(i,:) 
     error = abs(a-b(i,:)) 
     t 
     %%%%%%%%%%%%%%%%%%%%%%%% 
     break 
    end 
end 

Test kodudur:

a = [9.06319429228031e-12 8.37879678833309e-13]; 
b = [0 1;-1 0;1 0;0 1]; 
[Lia Locb] = find_element(a,b) 

çıktısı:

a = 
    1.0e-11 * 
    0.9063 0.0838 
B = 
    -1  0 
error = 
    1.0000 0.0000 
t = 
    1  1 
Lia = 
    1 
Locb = 
    2 
+1

Sadece ismember' sorunuzu ancak 'anlamak gerçekten zor sen' 'rows'' girişi belirtirseniz beklediğiniz şekilde çalışır yani belki bu kaynağı bu karışıklığın? Ayrıca, sorunuzun geri kalanını biraz daha açık olacak şekilde yeniden yazmayı deneyebilir ve testlerinizi sorgunuzda geçerli bir MATLAB kodu olarak gönderebilirsiniz. Bu şekilde google drive – Suever

+2

adresinden erişim talep etmek zorunda kalmadan kendimizi test edebiliriz bu matlab kodu nedir? Bir yorum karakteri olarak '#' nasıl kullanıyorsunuz? – Alex

+0

Birden çok satır içeren bir matrise karşı test mi yapıyorsunuz? Veya B = [-1 0]? –

cevap

0

ben artık kodunda sorun bulmak: t her satır kontrol etmeden önce başlatılması gerekir. t = zeros(size(a))'u i döngüsünün içine koyarak, şimdi çalışıyor.

... 
for i = 1:size(b,1) %loop through each row 
    t = zeros(size(a));%compare result of each element,logical array 
    for j = 1:size(b,2) %compare each element in each row 
.... 

Test ve çıkışı:

>> a = [9.06319429228031e-12 8.37879678833309e-13]; 
>> b = [0 1;-1 0;1 0;0 1]; 
>> [Lia Locb] = find_element(a,b) 

Lia = 

    0 


Locb = 

    0 
+0

evet, aynı cevabı yazıyordum. İkinci döngünün yerini, koşulun sonucunu doğrudan t'ye atayarak mı düşündünüz? –

+0

@FirefoxMetzger Bunu daha önce denedim ve çalışıyor. 'I = 1: boyutu (b, 1),% t = abs (ab (i:))

+0

Matlab, vektör kodu için büyük bir fan, çünkü derleyici bu tür kodları döngüleri kullanırken daha yüksek verimlilikle optimize eder. –

0

% için # dönüştürme sonra bulmak

aşağıdaki benim find_element kodudur Kodunuz, aşağıdaki örnekler için Matlab'da çalışır. Sorunuz Octave’da meydana gelirse lütfen açık bir tekrarlanabilir cevap verin veya sorunuzu düzenleyin.

>> a=1.0e-11*[0.9063 0.0838]; 
>> b=[-1 0]; 
>> [Lia, Locb] = find_element(a,b) 

Lia = 

    0 


Locb = 

    0 

>> [Lia, Locb] = find_element([-1.000001 0],b) 

a = 

      -1   0 


B = 

    -1  0 


error = 

     1e-06   0 


t = 

    1  1 


Lia = 

    1 


Locb = 

    1 
+0

Cevabınız için teşekkür ederiz. B sadece bir satır olduğunda çalışır. B' bir satırdan daha fazla olduğunda, 't' önceki satırların sonuçlarını saklar, bu nedenle doğru cevabı vermeyecektir. Belirsiz ifademden dolayı sıkıntı için üzülüyorum. Umarım şimdi daha iyi görünüyor. –