Поскольку запись [i, j] подсчитывает количество ненулевых элементов в поэлементном умножении строк i и j, вы можете сделать это, умножив matrix_logical
на его транспонирование (вам следует преобразовать в числовой тип данных сначала, например matrix_logical = single(matrix_logical)
):
inter = matrix_logical * matrix_logical';
И это работает как для разреженного, так и для полного представления.
EDIT
Для того чтобы вычислить numel(intersect(a,b))/numel(union(a,b));
(как указано в вашем комментарии), вы можете использовать тот факт, что для двух наборов a
и b
у вас есть
length(union(a,b)) = length(a) + length(b) - length(intersect(a,b))
Итак, вы можете сделать следующее:
unLen = sum(matrix_logical,2);
tmp = repmat(unLen, 1, length(unLen)) + repmat(unLen', length(unLen), 1);
inter = matrix_logical * matrix_logical';
inter = inter ./ (tmp-inter);