c++ - 遵循 Glynn 计算永久值的公式的矩阵乘法问题
问题描述
解决方案
我认为您确实需要检查两次您对方程式的理解。请记住,每个求和或乘法都是一个 for 循环。因此,通过使用原始论文中的符号,您会得到:
#include <vector>
#include <cassert>
using mat = std::vector<std::vector<double>>;
double permanent(const mat& input_matrix, const mat& sign_matrix)
{
int m = input_matrix.size();
assert(m > 2);
assert(input_matrix[0].size() == m);
assert(sign_matrix.size() == m);
int cols = sign_matrix[0].size();
assert(cols == 1 << (m - 1));
double result = 0;
for (int t = 0; t < cols; ++t) {
double delta = 1;
for (int k = 0; k < m; ++k) {
delta *= sign_matrix[k][t];
}
double p = 1;
for (int j = 0; j < m; j++) {
double s = 0;
for (int i = 0; i < m; i++) {
s += sign_matrix[i][t] * input_matrix[i][j];
}
p *= s;
}
result += delta * p;
}
return result / cols;
}
int main()
{
mat A = {
{ 1, 4, 7, },
{ 2, 5, 8, },
{ 3, 6, 9, },
};
mat sign_mat = {
{ 1, 1, 1, 1, },
{ 1, -1, 1, -1, },
{ 1, 1, -1, -1, },
};
auto perA = permanent(A, sign_mat);
}
推荐阅读
- jooq - 跨多个分支的 JOOQ 代码生成策略
- javascript - 如何自定义单击到双击?js
- amazon-web-services - aws CloudWatch Log Query Insights 的转义字符
- python - 用 Python pandas 处理杂乱的数据
- javascript - 用 createSound() 创建声音;没有错误
- wpf - wpf devexpress gridcontrol 与单选按钮,将 IsEnabled 绑定传递给 celltemplate
- html - 属性文件中带有 Thymeleaf -UTF-8 的 Spring Boot CRUD 应用程序
- java - 将依赖于迭代器的方法更改为依赖于 ArrayList 或任何替代 (Java)
- karate - 如何使用空手道中的浏览器缓存在 chrome 中运行测试场景?
- django - Django 搜索向量 - 完全关键字不匹配