【问题标题】:How to raise a zero-one matrix to any power in C++?如何在 C++ 中将零一矩阵提升到任意幂?
【发布时间】:2018-04-21 14:04:19
【问题描述】:

我制作了一个幂为 2 的零一矩阵。但是,我希望将代码应用于用户输入的任何幂。我试了好几次,还是不行。

这是您可能关心的部分代码。

注意:假设用户输入了他的 (n*m) 矩阵,即“a”,因为 n 和 m 相等并且它们用 s 表示。

k=0;
for(int j=0; j<s; j++)
    for(int i=0; i<s; i++)
    {
        m[k]=0;

        for(int t=0; t<s; t++)
        m[k]+=a[j][t]*a[t][i];

        k++;
    }

【问题讨论】:

    标签: c++ arrays loops matrix zero


    【解决方案1】:

    这是我对矩阵求幂的实现:

    struct matrix {
        intt m[K][K];
        matrix() {
            memset (m, 0, sizeof (m));
        }
        matrix operator * (matrix b) {
            matrix c = matrix();
            for (intt i = 0; i < K; i++) {
                for (intt k = 0; k < K; k++) {
                    for (intt j = 0; j < K; j++) {
                        c.m[i][j] = (c.m[i][j] + m[i][k] * b.m[k][j]) % MOD;
                    }
                }
            }
            return c;
        }
        matrix pow (intt n) {
            if (n <= 0) {
                return matrix();
            }
            if (n == 1) {
                return *this;
            }
            if (n % 2 == 1) {
                return (*this) * pow (n - 1);
            } else {
                matrix X = pow (n / 2);
                return X * X;
            }
        }
    };
    

    【讨论】:

    • 感谢您的努力。它似乎比我想象的要复杂,在尝试之前我需要一些时间来分析它。再次感谢。
    • 我假设 KMOD 是常量,intt 是在别处定义的别名。建议为您的方法添加一些解释,因为目前您只有代码答案,并且这些答案仅对Cargo Cult Programmers 真正有用,除非代码非常简单或自我记录(这不是)。
    • matrix operator * (matrix b) 应该很可能是matrix operator * (const matrix&amp; b),因此您不会制作不必要的副本。
    • @vsoftco 我也避免在乘法和 pow 递归中通过复制返回矩阵。如果有移动语义的可能性,情况会有所不同,但副本的数量会爆炸式增长。
    • @CostantinoGrana 那是“平方和乘法”算法,它非常有用,因为它以 O(log n) 步计算功率,en.wikipedia.org/wiki/Exponentiation_by_squaring 是的,你是对的,代码可以肯定会进一步优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多