Matlab:矩阵中行和列索引的高效匹配

Matlab: efficient matching of row and column indices in matrix

我想基于两个 n-by-1 索引向量 ab 创建逻辑 n-by-n 矩阵 A,这样 [=当且仅当 a(i)==b(j) 时,A 中的第 16=] 个元素是 1

一种方法如下:

  a = [1 1 2 3]';
  b = [2 3 1 3]';
  n = 4;

  a_mat = repmat(a, [1 n]);
  b_mat = repmat(b', [n 1]);

  A = a_mat == b_mat;

这种方法的问题是,如果 n 很大,它会变得非常占用内存。我正在寻找一种更有效的方法,它不需要创建巨大的 a_matb_mat 矩阵,而且速度也合理。

好吧,自己找到了答案,其实很琐碎(不确定是离开还是删除问题?):

    A = bsxfun(@eq, a, b');

由于matlab的隐式扩展(需要matlab R2016b或更新版本)

你可以简单地写:

A = a==b.';

基准

  n = 20000;
  a = randi([1,100],1,n)';
  b = randi([1,100],1,n)';
  A = zeros(n,'logical');

  % Solution 1
  tic
  a_mat = repmat(a, [1 n]);
  b_mat = repmat(b', [n 1]);

  A = a_mat == b_mat;
  toc

  % Solution 2
  tic
  A = bsxfun(@eq, a, b');
  toc

  % Solution 3
  tic
  A = a==b';
  toc

Elapsed time is 24.357663 seconds.
Elapsed time is 2.497311 seconds.
Elapsed time is 2.120866 seconds.

在内存使用方面,解决方案2和3应该很相似。一旦使用 sparse(A) 完成计算,您也可以稀疏矩阵以减小矩阵 A.

的大小