2016-03-29 6 views
-1

я пишу свою собственную версию ismember (find_element) в Matlab, чтобы проверить, является ли массив строк a в матрице b или нет, путем сравнения a с каждой строкой в ​​b. Если каждый элемент в a «равен» каждому элементу строки в b (если абсолютная ошибка меньше Tol), тогда верните логическое значение 1 и номер строки.Ошибка в сравнении Matlab?

Однако, когда я проверить свой код, я считаю, что Matlab вернется t=[1 1] при сравнении a=1.0e-11*[0.9063 0.0838] с B=[-1 0] (B является вторым рядом b). Фактически он дает правильную абсолютную ошибку error=[1.0000 0.0000], и, очевидно, error(1) больше, чем Tol=1e-6. Я нашел ошибку в Matlab? Или есть ли какие-либо ошибки в моем коде?

Ниже мой find_element код:

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 

тест-код:

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

выход:

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

Это действительно трудно понять ваш вопрос, но 'ismember' только работает так, как вы ожидаете, если вы указываете' 'rows'' ввод так может быть, источник ваше замешательство? Также можете ли вы попытаться переписать остальную часть своего вопроса, чтобы быть немного яснее, и фактически опубликовать ваши тесты как действительный код MATLAB в вашем вопросе? Таким образом, мы можем протестировать его самостоятельно, без необходимости запрашивать доступ с вашего диска Google – Suever

+2

- это код matlab? Как вы используете символ '#' как символ комментария? – Alex

+0

Вы тестируете матрицу с более чем одной строкой? Или B = [-1 0]? –

ответ

0

теперь я нахожу эту проблему в моем коде: t необходимо инициализировать перед проверкой каждой строки. Поместив t = zeros(size(a)) внутри цикла i, он работает сейчас.

... 
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 
.... 

Тест и вывод:

>> 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

Да, я писал тот же ответ. Вы решили заменить второй цикл, напрямую назначив результат условия t? –

+0

@FirefoxMetzger Я пробовал это раньше, и он работает. 'для i = 1: размер (b, 1)% t = abs (ab (i,:))

+0

Matlab - большой поклонник векторизованного кода, так как его компилятор оптимизирует такой код с большей эффективностью, чем при использовании циклов. –

0

После преобразования # в %, я считаю, что ваш код работает в Matlab для следующих примеров. Пожалуйста, предоставьте четкий воспроизводимый ответ или отредактируйте свой вопрос, если ваша проблема возникает в Octave.

>> 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

Благодарим вас за ответ. Он работает, когда 'b' - всего одна строка. Когда 'b' больше, чем одна строка,' t' сохраняет результаты предыдущих строк, поэтому он не даст правильного ответа. Мне жаль неприятностей из-за моего неясного заявления. Надеюсь, теперь это выглядит лучше. –

Смежные вопросы