- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Python 3 和 numpy 矩阵实现 CLRS 中描述的 Strassen 矩阵乘法算法。
问题在于输出矩阵 C 作为零矩阵返回,而不是正确的乘积。我不确定为什么我的实现不起作用,但怀疑这与每次递归调用创建 C 矩阵有关。对于我做错了什么以及如何解决它的任何解释,我将不胜感激。
谢谢!
import numpy as np
def strassen(A,B):
n = A.shape[0]
C = np.zeros((n*n), dtype=np.int).reshape(n,n)
if n == 1:
C[0][0] = A[0][0] * B[0][0]
else:
k = int(n/2)
A11,A21,A12,A22 = A[:k,:k], A[k:, :k], A[:k, k:], A[k:, k:]
B11,B21,B12,B22 = B[:k,:k], B[k:, :k], B[:k, k:], B[k:, k:]
C11,C21,C12,C22 = C[:k,:k], C[k:, :k], C[:k, k:], C[k:, k:]
S1 = B12 - B22
S2 = A11 + A12
S3 = A21 + A22
S4 = B21 - B11
S5 = A11 + A22
S6 = B11 + B22
S7 = A12 - A22
S8 = B21 + B22
S9 = A11 - A21
S10= B11 + B12
P1 = strassen(A11, S1)
P2 = strassen(S2, B22)
P3 = strassen(S3, B11)
P4 = strassen(A22, S4)
P5 = strassen(S5, S6)
P6 = strassen(S7, S8)
P7 = strassen(S9, S10)
C11 = P5 + P4 - P2 + P6
C12 = P1 + P2
C21 = P3 + P4
C22 = P5 + P1 - P3 - P7
return C
最佳答案
好的,我只需用新值更新切片 C[:k,:k] 即可使其工作,而不是创建新变量 C11、C12 ..ect。因为这样做会创建一个新矩阵,并且不是对原始矩阵 C 的引用。
关于python - 使用带有 numpy 矩阵的 Strassen 算法的输出矩阵不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47126172/
假设我有一个 NxN 矩阵,其中充满 1 到 10 范围内的随机整数。现在我想打电话PROC(A(1:n/2, 1:n/2)+A(n/2+1:n, n/2+1:n)... 其中 n 是矩阵的大小。换句
作为作业的一部分,我试图找出 Strassen 矩阵乘法和朴素乘法算法的交叉点。但同样,当矩阵变为 256x256 时,我无法继续。有人可以建议我适当的内存管理技术,以便能够处理更大的输入。 C语言代
我们的想法是创建一个计时器,该计时器将返回执行特定功能所需的时间。我坐下来编写了一个矩阵类和一个 Strass 函数,应该将我输入其中的值相乘。 定时器函数工作正常,因为它返回执行 Strass 函数
您好,我正在尝试提高 Strassen 算法的效率,但需要一些帮助。该算法的递归关系如下: A(n) = 7A(n/2)+18(n/2)^2, for n>1, A(1) = 0. 我已经解决了这个问
使用与 Strassen's 相同的方法仅 5 次乘法就足以计算矩阵的平方。如果 A[2][2] = [a, b, c, d],则乘法为 a * a、d * d、b * (a + d)、c * (a
我正在尝试解决 Strassen 算法的奇数矩阵问题。我的实现在某个点截断递归,称之为 Q,然后切换到标准实现。因此,在进行静态填充时,我实际上不需要填充到 2 的下一个幂。我只需要填充到至少大于输入
我一直在阅读关于矩阵乘法的 Strassen 算法。 正如 Cormen 在算法导论中提到的,该算法并不直观。但是,我很想知道是否存在任何严格的算法数学证明以及算法设计中实际采用的内容。 我尝试在 G
我从某处复制了 strassen 的算法,然后执行了它。这是输出 n = 256 classical took 360ms strassen 1 took 33609ms strassen2 took
Strassen 的矩阵乘法算法仅比传统的 O(N^3) 算法略有改进。它具有更高的常数因子并且更难实现。考虑到这些缺点,strassens 算法是否真的有用,它是否在任何用于矩阵乘法的库中实现?此外
我想知道您将如何在 Strassen 算法中进行递归调用,以及它们究竟在哪里需要。 我知道 7 个乘法器比 8 个乘法器更有效,但我对如何递归计算这些乘法器感到困惑。特别是,如果我们遵循分而治之的范式
我正在尝试使用 NTT 实现 Schonhage-Strassen 乘法算法,但遇到了一个问题,即最终生成的向量实际上并不等于它应有的值。 对于两个输入向量 a 和 b,每个向量由 N 个“数字”组成
我很难构思如何实现 Strassen 版本的该算法。 对于背景,我有以下迭代版本的伪代码: def Matrix(a,b): result = [] for i in range(0,
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我们怎样才能改变 Strassen algorithm以便它适用于任何大小的矩阵(例如 n=5)? 最佳答案 您所要做的就是用 0 的行和列填充矩阵,直到它们成为大小为 2 的幂的方阵。或者换句话说:
我接到了一项任务,要用 C++ 编写 Strassen-Winograd 算法。我已经写了两次,但我的代码的第一个版本不起作用。结果矩阵左下角的结果是正确的。我的第二个版本运行速度比原始算法慢,即使
我用 C++、Python 和 Java 编写了矩阵乘法程序,并测试了它们对两个 2000 x 2000 矩阵相乘的速度(参见 post)。标准 ikj 实现 - 在 中- 拍摄: C++:15 秒(
我用 C++ 编写了两个矩阵乘法程序:Regular MM (source) , 和 Strassen 的 MM (source) ,它们都在大小为 2^k x 2^k 的方阵上运行(换句话说,是偶数
我正在尝试在 Python 中实现 Strassen 矩阵乘法。我已经让它发挥了一些作用。这是我的代码: a = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]] b
我通过 Strassen 算法和 Python 3 中的朴素嵌套 for 循环实现得到了不同的矩阵乘法输出。 代码: def new_matrix(r, c): """Create a new
我是一名优秀的程序员,十分优秀!