- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们的想法是创建一个计时器,该计时器将返回执行特定功能所需的时间。我坐下来编写了一个矩阵类和一个 Strass
函数,应该将我输入其中的值相乘。
定时器函数工作正常,因为它返回执行 Strass
函数所花费的时间。但是,Strass
函数不会返回已相乘的矩阵。它是全零矩阵。就好像 Strass
函数没有给 Matrix C 分配任何东西一样。从来没有。
例如,将 2x2 矩阵相乘会得到以下结果:
0.00 // P1
0.00 0.00 // the matrix after multiplication
0.00 0.00
7102000 // the time it took to do this
Strass
函数如下所示:
public static void Strass(Matrix A, Matrix B, Matrix C) {
// It has been suggested that P1-P7 should be of size
// A.size()/2. Changing this does not fix the problem.
Matrix P1 = new Matrix(A.size());
Matrix P2 = new Matrix(A.size());
Matrix P3 = new Matrix(A.size());
Matrix P4 = new Matrix(A.size());
Matrix P5 = new Matrix(A.size());
Matrix P6 = new Matrix(A.size());
Matrix P7 = new Matrix(A.size());
// if n = 1 then
if (A.size() == 1) {
C = A.times(B);
} else {
if (A.size() != B.size()) throw new RuntimeException("Somehow, the sizes of the matrices aren't equal.");
int sizeOf = A.size();
// The ungodly recursive calls.
Strass(A.partition(1, sizeOf/2, 1, sizeOf/2).plus(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), B.partition(1, sizeOf/2, 1, sizeOf/2).plus(B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), P1);
Strass(A.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).plus(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), B.partition(1, sizeOf/2, 1, sizeOf/2), P2);
Strass(A.partition(1, sizeOf/2, 1, sizeOf/2), B.partition(1, sizeOf/2, sizeOf/2+1, sizeOf).minus(B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), P3);
Strass(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf), B.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).minus(B.partition(1, sizeOf/2, 1, sizeOf/2)), P4);
Strass(A.partition(1, sizeOf/2, 1, sizeOf/2).plus(A.partition(1, sizeOf/2, sizeOf/2+1, sizeOf)), B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf), P5);
Strass(A.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).minus(A.partition(1, sizeOf/2, 1, sizeOf/2)), B.partition(1, sizeOf/2, 1, sizeOf/2).plus(B.partition(1, sizeOf/2, sizeOf/2+1, sizeOf)), P6);
Strass(A.partition(1, sizeOf/2, sizeOf/2+1, 1).minus(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), B.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).plus(B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), P7);
C.addPart(1, sizeOf/2, 1, sizeOf/2, (P1.plus(P4)).minus(P5.plus(P7)));
C.addPart(sizeOf/2+1, sizeOf, 1, sizeOf/2, (P2.plus(P4)));
C.addPart(1, sizeOf/2, sizeOf/2+1, sizeOf, (P3.plus(P5)));
C.addPart(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf, (P1.plus(P3)).minus(P2.plus(P3)));
}
}
我已经测试了 addPart
函数,据我所知它工作正常。加号和减号功能也是如此。我尽我最大的努力去检查并验证我在所有正确的位置都有正确的尺寸和数字,我非常确定我做到了。所以,在所有这一切的某个地方,有些地方不对劲。
为了引用和简洁,我粘贴了所有相关代码 here .
最佳答案
C = A.times(B);
不正确。这会将一个新矩阵分配给C
,它不会修改传入的矩阵对象。
关于java - Strassen 的算法归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868040/
假设我有一个 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
我是一名优秀的程序员,十分优秀!