首页 > 解决方案 > 如何制作两个随机向量向量的克罗内克积?

问题描述

我需要创建一个函数,它需要两个参数(两个向量向量),结果返回一个向量向量,它是两个给定向量向量的克罗内克乘积。

无论我做什么,我的新向量向量都是由相同的数字创建的(应该只在最后一个位置)。例如,如果我有向量 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;
}

标签: c++

解决方案


这是 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 

推荐阅读