对以下代码进行了哪些更改可以使其适用于热带矩阵(热带代数)。
热带代数是: x⊕y= x和y的最小值 x⊗y= x + y
for(i=0;i<m;++i)
{
for(j=0;j<q;++j)
{
c[i][j]=0;
for(k=0;k<n;++k)
c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
cout<<c[i][j]<<" ";
}
cout<<"\n";
}
我也在用C#开发它。如果在C#中为此构建了库,那将会非常有用。
答案 0 :(得分:2)
如果你想要的矩阵乘法确实是c_ij = a_i1 ⊗ b_1j ⊕...⊕ a_in ⊗ b_nj
,那么你的代码应该是
for (i = 0; i < m; ++i) {
for (j = 0; j < q; ++j) {
auto tmp = (a[i][0] + b[0][j]); // this is the first ⊗
for (k = 1; k < n; ++k)
// std::min is the ⊕ operation
tmp = std::min(tmp, (a[i][k] + b[k][j]));
c[i][j] = tmp;
cout << c[i][j] << " ";
}
cout << "\n";
}
如果您不使用c ++ 11,则必须将auto
替换为矩阵中元素的类型。