如何使向量的两个随机向量的Kronecker积?

时间:2019-03-26 21:27:23

标签: c++

我需要制作一个具有两个参数(两个向量的向量)的函数,结果返回一个向量,该向量是两个给定向量的Kronecker乘积。

无论我做什么,我的新向量向量都是由相同的数字创建的(该向量只能在最后一个位置)。例如,如果我有向量A:{3,-1},{0,5}和B:{4,3,15},{0,-5,2}的向量,我的Kronecker乘积将是:{10, 10、10、10、10、10},{10、10、10、10、10、10}等,而不是{12、9、45,-4,-3,-15},{0,-15 ,6、0、5,-2),{0、0、0、20、15、75},{0、0、0、0,-25、10}

Matrix KroneckersProduct(Matrix A, Matrix B){
    Matrix mat=CreateMatrix(NoRows(A)*NoRows(B),NoCols(A)*NoCols(B));
    for(int i=0;i<NoRows(A)*NoRows(B);i++){
        for(int j=0;j<NoCols(A)*NoCols(B);j++){
            for(int k=0;k<NoRows(A);k++){
                for(int l=0;l<NoRows(B);l++){
                    for(int m=0;m<NoCols(A);m++){
                        for(int n=0;n<NoCols(B);n++){
                            mat.at(i).at(j)=A.at(k).at(m)*B.at(l).at(n);
                        }
                    }
                }
            }
        }
    }
    return mat;
}

1 个答案:

答案 0 :(得分:1)

这是Kronecker产品的算法。也许我切换了v1v2

#include <vector>
#include <iostream>

using Matrix = std::vector<std::vector<double>>;

Matrix KroneckersProduct(Matrix v1, Matrix v2){
    Matrix v(v1.size() * v2.size(), std::vector<double>(v1[0].size() * v2[0].size()));
    for (std::size_t z1(0); z1 < v1.size(); ++z1) {
        for (std::size_t z2(0); z2 < v2.size(); ++z2) {
            for (std::size_t z3(0); z3 < v1[0].size(); ++z3) {
                for (std::size_t z4(0); z4 < v2[0].size(); ++z4) {
                    v[z1*v2.size() + z2][z3*v2[0].size() + z4] = v1[z1][z3] * v2[z2][z4];
                }
            }
        }
    }
    return v;
}

int main() {
    Matrix v1{{3, -1},{0, 5}};
    Matrix v2{{4,3,15}, {0, -5, 2}};

    Matrix v(KroneckersProduct(v1, v2));

    for (const auto& row : v) {
        for (const auto& cell : row) {
            std::cout << cell << " ";
        }
        std::cout << '\n';
    }
    return 0;
}

输出:

12 9 45 -4 -3 -15 
0 -15 6 -0 5 -2 
0 0 0 20 15 75 
0 -0 0 0 -25 10