я пишу свою собственную версию 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
Это действительно трудно понять ваш вопрос, но 'ismember' только работает так, как вы ожидаете, если вы указываете' 'rows'' ввод так может быть, источник ваше замешательство? Также можете ли вы попытаться переписать остальную часть своего вопроса, чтобы быть немного яснее, и фактически опубликовать ваши тесты как действительный код MATLAB в вашем вопросе? Таким образом, мы можем протестировать его самостоятельно, без необходимости запрашивать доступ с вашего диска Google – Suever
- это код matlab? Как вы используете символ '#' как символ комментария? – Alex
Вы тестируете матрицу с более чем одной строкой? Или B = [-1 0]? –