Один из способов сделать это состоит в том, чтобы рассматривать каждую матрицу как векторы в N
мерном пространстве, и вы можете найти норму L 2 (или евклидово расстояние) каждого вектора. После, проверьте, если расстояние равно 0. Если это так, то у вас есть совпадение. В частности, вы можете создать матрицу так, чтобы элемент (i,j)
в этой матрице вычислял расстояние между строкой i
в одной матрице и строкой j
в другой матрице.
Вы можете решить вашу проблему, изменив матрицу расстояний, полученную в результате этой задачи, так что 1 означает, что два вектора полностью одинаковы, а 0 - в противном случае.
Этот пост должен представлять интерес: Эффективно вычислить попарно возведенное в квадрат евклидово расстояние в Matlab .
Я бы специально посмотрел на ответ Шая Багона, который использует матричное умножение и вещание. Затем вы изменили бы его, чтобы найти расстояния, равные 0:
nA = sum(A.^2, 2); % norm of A's elements
nB = sum(suppX.^2, 2); % norm of B's elements
Xresponse = bsxfun(@plus, nB, nA.') - 2 * suppX * A.';
Xresponse = Xresponse == 0;
Получаем:
Xresponse =
3×4 logical array
1 1 0 1
0 0 0 0
0 0 1 0
Примечание по эффективности с плавающей точкой
Поскольку вы используете ismember
в своей реализации, для меня неявно, что вы ожидаете, что все значения будут целочисленными. В этом случае вы можете очень сильно сравнить непосредственно с нулевым расстоянием без потери точности. Если вы намереваетесь перейти к плавающей точке, вы всегда должны сравнивать с небольшим порогом вместо 0, например Xresponse = Xresponse <= 1e-10;
или чем-то подобным. Я не верю, что это необходимо для вашего сценария.