我正在尝试做一个布尔函数来验证矩阵是否对称,但是我收到了这个错误:
| 54 |错误:无法转换'float()[(((sizetype)(((ssizetype)n)+ -1))+ 1)]''浮动()[ 100]'for argument'3'to'void Transpose(int,float()[100],float()[100])'|
#include <iostream>
using namespace std;
void Transpose(int n, float a[][MAX], float T[][MAX]) {
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
T[i][j] = a[j][i];
}
}
}
bool Symmetric(int n, float a[][MAX]) {
float t[n][n];
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
t[i][j] = 0;
}
}
Transpose(n,a,t); // <--- Error here.
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(t[i][j] != a[i][j]){
return false;
}
}
}
return true;
}
错误发生在Transpose(n,a,t);
行
答案 0 :(得分:2)
编译器说的是float t[n][n]
数组n
,其中float T[][MAX]
是编译时变量[即不是常数]与MAX
不匹配,{{1是一个编译时常量。
将float t[n][MAX]
用于临时矩阵可能会正常工作。但是,请记住,C和C ++不处理“可变大小数组”(特别是在将它们从一个函数传递到另一个函数时),并且在C ++中,使用不同的方式可能更好。描述你的矩阵。例如:
std::vector<vector<float>> t;
然后,您需要做更多工作来定义矢量的大小,例如:
t.resize(n);
for(i = 0; i < n; i++){
t[i].resize(n);
答案 1 :(得分:0)
你可以做的是用std :: vector&lt;替换那些数组。矢量&lt;浮动&gt;&gt;,正如其他答案所述。我会使用typedef来使事情变得更简单。此外,一旦开始使用向量,可以通过其他方式利用它,例如更容易初始化。
#include <vector>
typedef std::vector<float> Float1D;
typedef std::vector<Float1D> Float2D;
void Transpose(int n, const Float2D& a, Float2D& T)
{
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
T[i][j] = a[j][i];
}
}
bool Symmetric(int n, Float2D& a)
{
Float2D t(n, Float1D(n,0));
Transpose(n,a,t);
// assuming that a and t are the same size matrix
return t == a;
}
注意对称函数中t向量的初始化。不需要循环,因为所有操作都是使用行大小n来声明它,并使用1维浮点向量初始化每一行,并将1-d数组中的每个条目初始化为0。
还要注意最后的测试。我所做的就是使用operator ==比较向量是否具有相等的组件。
使用上面的代码,我假设你的矩阵大小相同。如果没有,你需要进行检查以确保这一点(我没有这样做)。