Вы можете сделать это с неявным расширением для создания трехмерной матрицы сравнений, если у вас достаточно памяти.
AL = A(:,1:end/2);
AR = A(:,end/2+1:end);
AcompLR = squeeze( all( AL == reshape( AR.', 1, 2, [] ), 2 ) );
AcompRL = squeeze( all( reshape( AL.', 1, 2, [] ) == AR, 2 ) );
[iA(:,1), iA(:,2)] = find( AcompLR & AcompRL );
iA = unique( sort(iA,2), 'rows' );
Возвращает iA
, где столбец 1 - это ваш iA1
, а столбец 2 - это ваш iA2
.
Обратите внимание, что мне нужно было unique
, чтобы избежать обратных совпадений, т. е. [5,7]/[7,5]
Я не делал никаких тестов, но это может быть быстрее, чем циклы все делается за одну операцию. Вместо этого мы могли бы быть умнее с индексированием и делать только необходимые сравнения, это сэкономило бы память и вызов unique
:
% Create row indices to cover all combinations of rows
rIdx = arrayfun( @(x) [ones(x,1)*x,(1:x).'], 1:size(A,1), 'uni', 0 );
rIdx = vertcat( rIdx{:} );
% Logical indexing comparisons
iA = rIdx( all( A( rIdx(:,1), 1:end/2 ) == A( rIdx(:,2), end/2+1:end ), 2 ) & ...
all( A( rIdx(:,2), 1:end/2 ) == A( rIdx(:,1), end/2+1:end ), 2 ), : );