c++ - 如何制作两个随机向量向量的克罗内克积?
问题描述
我需要创建一个函数,它需要两个参数(两个向量向量),结果返回一个向量向量,它是两个给定向量向量的克罗内克乘积。
无论我做什么,我的新向量向量都是由相同的数字创建的(应该只在最后一个位置)。例如,如果我有向量 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;
}
解决方案
这是 Kronecker 乘积的算法。也许我换v1
了v2
#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
推荐阅读
- javascript - 我可以使用 AWS lambda 作为 WebSocket(AWS IoT 堆栈)的客户端吗?
- python - Keras CNN val_accuracy、loss、accuracy
- python - Python内存管理的困惑
- regex - 正则表达式:浮点数与非数字符号的完全匹配
- nginx - unknown directive "state" in nginx 1.17.7
- database - DB21015E The Command Line Processor backend process request queue or input queue was not created within the timeout period
- go - time.Location() returns as "Local" even if /etc/localtime is correct
- javascript - 尽管已经在 vuejs 的 for 循环中创建了复选框,但单独检查和取消选中复选框
- ubuntu - 使用 gnuplot 绘制进程树
- haskell - Is this idiomatic Haskell - Two Sum Question