我的代码中有两个大矩阵,它们具有相同的列数和不同的行数。如A(20000X4000)
和B(30000X4000)
。两者都是 0-1 稀疏。
我应该检查 A 的每一行和 B 的所有行,并计算公共(public) 1 的数量。例如,如果 A(1,:)=[0 1 0 1 1]
和 B([1 2],:)=[1 1 1 1 1;0 0 0 1 1 ]
,我需要得到 3
和 2
的结果。
假设有一个大型 0-1 矩阵 C(50000X4000)
,其行标记为 A
类型或 B
类型。我应该比较 A
和 B
的所有行并枚举 1。如果 A 和 B 的每一行中 1 的数量大于某个界限,那么我将使用 A 和 B 的这些行进行其余的计算。因此,我什至不需要存储 A
和 B
,我所需要的只是行索引对的列表。像 [(3,2),(3,5),...]
这样的东西表明我应该使用 A
的第三行和 第二行>B
,也是A
的第三个和B
的第五个,依此类推。
我首先想到的是A*B'
,它给出了正确的结果,但实际上它的成本非常高,并且在某些情况下不可能进行这种乘法。
我将矩阵转换为单一数据类型,它变得更快了一些。稀疏没有帮助。
这个任务看起来很简单,只需计算A
的每一行和B
的所有行的公共(public)1,但实现起来并不容易。考虑到代码应该执行此任务 1000 次,那么这实际上是不可能的。
知道如何在不进行乘法的情况下枚举常见的吗? (顺便说一句,循环也没有帮助)。
谢谢。
最佳答案
我不知道这是否真的比你所拥有的更好,因为它仍然有一个 for 循环,但如果有人能弄清楚如何删除该 for 循环,你应该很高兴。
% create temp data
A = rand(20000,4000) < 0.5;
B = rand(30000,4000) < 0.5;
counts = zeros(size(A,1),size(B,1),'uint8');
for i = 1:size(A,1)
counts(i,:) = sum(bsxfun(@eq,A(i,:),B),2);
end
无论哪种方式,该过程都会花费很长时间,因为您要比较 30000 行,每行 4000 个元素,20000 次,或者大约 2.4e+12
次比较。这是一项艰巨的任务,肯定需要很长时间。如果您需要更快,可以尝试使用并行计算。
关于matlab - 如何避免Matlab中的大矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381098/