matlab - 如何避免Matlab中的大矩阵乘法

标签 matlab matrix matrix-multiplication enumerate large-scale

我的代码中有两个大矩阵,它们具有相同的列数和不同的行数。如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 ],我需要得到 32 的结果。

假设有一个大型 0-1 矩阵 C(50000X4000),其行标记为 A 类型或 B 类型。我应该比较 AB 的所有行并枚举 1。如果 A 和 B 的每一行中 1 的数量大于某个界限,那么我将使用 A 和 B 的这些行进行其余的计算。因此,我什至不需要存储 AB,我所需要的只是行索引对的列表。像 [(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/

相关文章:

matlab - 动态变量matlab

matlab - 在Matlab中从WAV文件中消除噪音

python - 给定一个 N 边方阵,有没有办法在不使用循环或 if 条件的情况下找到单元格的环值?

C - 在结构数组内打印二维数组的元素

matlab - 在 Matlab 中的父类(super class)上定义自定义方法和属性 block

matlab - 如何将信号归一化为零均值和单位方差?

在 R 中的参数值范围内运行 2 个参数的函数

matlab - 矩阵序列的矩阵乘法

c++ - Eigen 库中的稀疏稀疏积 A^T*A 优化

c - vector 数学库和矩阵运算