gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:32:21 28 4
gpt4 key购买 nike

我的代码中有两个大矩阵,它们具有相同的列数和不同的行数。赞 A(20000X4000)B(30000X4000) .两者都是0-1稀疏。

我应该用 B 的所有行检查 A 的每一行并计算常见的 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 .我应该比较 A 的所有行和 B一起枚举1。如果 A 和 B 的每一行中 1 的数量大于某个界限,那么我将使用 A 和 B 的那些行进行其余的计算。所以,我什至不需要存储 AB ,我只需要一个行索引对列表。类似 [(3,2),(3,5),...]这表明我应该使用 A 的第三行和B的第二行,也是 A 的第三个和 B 的第五个等等。

我首先想到的是A*B' ,它给出了正确的结果,但实际上它非常昂贵,在某些情况下不可能进行这种乘法。

我将矩阵转换为单一数据类型,它变得更快了。稀疏没有帮助。

任务似乎很简单,只需计算 A 的每一行的常见 1s以及 B 的所有行,但实现起来并不容易。考虑到代码应该执行 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com