Matlab:矩阵

时间:2017-09-19 18:42:48

标签: matlab matrix indexing matching

我想基于两个n-by-n索引向量An-by-1创建一个逻辑a矩阵b,以便{{1}当且仅当(i,j)时,A中的第{}个元素为1

执行此操作的一种方法如下:

a(i)==b(j)

这种方法存在的问题是,如果 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; 很大,它会变得非常耗费内存。我正在寻找一种更有效的方法,不需要创建巨大的na_mat矩阵,而且速度也合理。

2 个答案:

答案 0 :(得分:1)

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

您可以简单地写一下:

A = a==b.';

<强> BENCHMARK

  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的大小。

答案 1 :(得分:0)

好吧,我自己找到了答案,实际上是相当微不足道的(不确定是留下还是只是删除问题?):

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