2016-10-14 3 views
1

Как проверить, идентичны ли два вектора? Я попытался сделать это с помощью цикла for и if, но этот параметр не подходит для количества данных, с которыми мне нужно работать. Есть ли разумный способ сделать это? Я хотел бы создать оператор if, который добавляет только вектор к матрице, если в моей матрице нет такого вектора.Сравните, если два вектора одинаковы

Например, если у меня есть вектор [1 2 3 1 2] в моей матрице, я не хочу добавлять в матрицу еще один вектор [1 2 3 1 2].

+0

@erfan принятого ответа говорит «' IsMember (M, v, 'строк') '». Разве вы не думаете, что 'any (ismember (M, v, 'rows'))' будет подходящим решением? Если вы можете найти индекс, вы можете проверить его наличие. * Так же, как ваш ответ здесь говорит так *. По крайней мере, не притворяйся, что это не вопиющий обман. –

+0

@AndrasDeak Да, часть моего ответа здесь * похожа на ответ там, но, насколько я знаю, обман касается вопросов, а не ответов. На что на самом деле спрашивают OP, можно ответить с помощью 'isequal' и все. Также не связан с связанным вопросом. Но если мы обратим внимание на детали вопроса, можно объяснить больше, чем объяснено (и хорошо объяснено) в связанном вопросе. – erfan

+1

@erfan не всегда конструктивно, чтобы быть чрезмерно аналитическими о дубликатах, если ответы, принятые/принятые, решают вопрос с минимальной дополнительной функцией мозга.В простых вопросах, подобных этому, подходящий дубликат может предотвратить появление некачественных ответов, подобных грибам ... отчасти это и произошло здесь. Я считаю, что 'ismember' связанного дубликата решает проблему XY OP (X =", если матрица содержит вектор ", Y =", как я могу проверить равенство на два вектора? "). Что полезно для будущих читателей (и так для SO) - это показать, как проблемы * должны быть решены. –

ответ

1

Для проверки того, равно ли 2 вектора, вы можете использовать оператор == на векторе, а затем использовать all(), чтобы проверить, что каждый элемент возвращаемого логического массива является истинным. Ссылка Andras Deak в комментариях содержит несколько отличных методов поиска вектора в большем наборе.

v1 = [1 2 3 1 2]; 
v2 = [1 2 3 1 2]; 
returnsTrue = all(v1 == v2); 
+0

Вы должны _never_ использовать '==' при сравнении чисел с плавающей запятой. По численным причинам вы должны использовать 'all (abs (v1-v2)

1

Для вашего вопроса о сравнении двух векторов, можно использовать isequal:

tf = isequal(vec1, vec2); 

Но, насколько я понял, каждый вектор (vec) будет строка в вашей конечной матрице (Mat), и вы хотите сохранить ряды Mat уникальными. Если это так, здесь два метода:

Прежде всего, нужно проверить, прежде чем добавить строку. Используйте ismember для этой цели:

tf = ismember(vec, Mat, 'rows'); % it gives you true if vec is a row in Mat 

Или вы можете вставить все векторы без проверки и в конце сбора unique строки:

Mat = unique(Mat, 'rows'); 

Какой я должен выбрать?

Этот вопрос имеет значение, если у вас есть большой Mat и/или вы хотите добавить много vec s к нему. В этом случае, если очень вероятно, что vec уже является строкой в ​​Mat, например, когда элементы могут быть целыми числами в ограниченном диапазоне, второй метод может привести к очень большому Mat, прежде чем вы получите unique, и поэтому я бы не стал предложите это. В противном случае второй метод более удобен.

2

вы могли бы использовать IsEqual функцию, а

A1 = [1 5 6]; 
A2 = [1 4 3]; 
A3 = [1 1 1]; 

result = isequal(A1,A2,A3) 

Но если один из ваших элементов будет NAN то IsEqual всегда возвращает 0 (ложь)

+0

Способ найти угловой футляр! – bwall