Matlab:矩阵中行和列索引的高效匹配
Matlab: efficient matching of row and column indices in matrix
我想基于两个 n-by-1
索引向量 a
和 b
创建逻辑 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_mat
和 b_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.
的大小
我想基于两个 n-by-1
索引向量 a
和 b
创建逻辑 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_mat
和 b_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.