我想基于两个n-by-n
索引向量A
和n-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;
很大,它会变得非常耗费内存。我正在寻找一种更有效的方法,不需要创建巨大的n
和a_mat
矩阵,而且速度也合理。
答案 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');