【发布时间】:2013-12-04 16:46:05
【问题描述】:
我的代码中有两个大矩阵,它们的列数相同,行数不同。喜欢A(20000X4000) 和B(30000X4000)。两者都是 0-1 稀疏的。
我应该检查 A 的每一行和 B 的所有行,并计算常见 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 的所有行的公共1,但并不容易实现。考虑到代码应该像 1000 次一样完成这个任务,那么这实际上是不可能的。
知道如何在不乘法的情况下枚举常见的吗? (顺便说一句,循环也没有帮助)。
谢谢。
【问题讨论】:
-
矩阵有多稀疏,即大约有多少个?
-
一般来说,
A*B'无法改进。甚至切换到 C++ 也可能不会带来显着的改进。因此,您唯一的希望是 1. 以不同的方式解决问题,或 2. 使用更多有用的信息。它是一个逻辑矩阵的事实就是这种信息,但不幸的是它还不够。你可以问自己,矩阵有多稀疏,它们有特定的结构吗?你的结果矩阵有多稀疏? -
无论如何,结果将是一个 20000 x 30000 的矩阵。你真的需要这个矩阵吗?当你拥有它时,你打算用它做什么?
-
其实我不需要这些矩阵,我想列举两个矩阵的公因数。就像假设有一个大的 0-1 矩阵 C(50000X4000) 并且它的行被标记为类型 A 或类型 B。我应该将 A 和 B 的所有行一起比较并枚举 1。如果 A 和 B 的每一行中 1 的数量大于某些界限,那么我将使用 A 和 B 的这些行进行其余的计算。
-
@Alef,我认为如果您编辑您的问题以包含此信息,并在评论中比此处更详细地解释它,这真的会帮助您获得有用的答案。也许有一种方法可以在没有这种计算的情况下达到您的目标。
标签: matlab matrix matrix-multiplication enumerate large-scale