Java 这在技术上是可能的吗?

Java 这在技术上是可能的吗?,java,c++,Java,C++,我有两个矩阵,分别是200000x3000和30000x200000。它们是密集的,大多数值(80%)已填充 这需要多少次迭代?朴素算法需要120万亿次运算,即O(120000000000000),因此可能需要一段时间 每个操作数大约需要4.5 GB,而输出矩阵大约需要298 GB,假设每双字节8个字节 与naive算法相比,这并不简单,因为: 此外,矩阵不需要是平方的。可以使用相同的方法将非平方矩阵一分为二,从而生成更小的非平方矩阵。如果矩阵具有足够的非平方性,那么使用基本上是O(n2)的简单

我有两个矩阵,分别是200000x3000和30000x200000。它们是密集的,大多数值(80%)已填充


这需要多少次迭代?

朴素算法需要120万亿次运算,即O(120000000000000),因此可能需要一段时间

每个操作数大约需要4.5 GB,而输出矩阵大约需要298 GB,假设每双字节8个字节

与naive算法相比,这并不简单,因为:

此外,矩阵不需要是平方的。可以使用相同的方法将非平方矩阵一分为二,从而生成更小的非平方矩阵。如果矩阵具有足够的非平方性,那么使用基本上是O(n2)的简单方法,将初始运算减少到更多的平方积是值得的。例如:

  • 大小为[2N x N]*[N x 10N]的产品可以作为20个独立的[N x N]*[N x N]操作进行,以形成结果
  • 大小为[N x 10N]*[10N x N]的乘积可以作为10个独立的[N x N]*[N x N]运算,相加形成结果
这些技术将使实现更加复杂,而不是简单地填充到二次方的幂;然而,一个合理的假设是,任何执行Strassen乘法(而非传统乘法)的人都会将计算效率置于比实现简单性更高的优先级


另请参见。

否,因为第一个矩阵的列数必须与第二个矩阵的行数相匹配。不过,您可以将一个乘以另一个的转置。@user2357112谢谢,转置是可以接受的。为什么不可能呢?@clcto计算起来可能需要很长时间。只有一种方法可以让您知道问题的答案:试试看。你可能会在任何人发布答案之前得到答案。如果我使用Strassen算法?