1

我正在尝试做一个布尔函数来验证矩阵是否对称,但我收到了这个错误:

|54|错误:无法将参数 '3' 的 'float ( )[(((sizetype)(((ssizetype)n) + -1)) + 1)]' 转换为 'float ( )[100]'无效转置(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);

4

2 回答 2

2

编译器所说的是float t[n][n]where nis a compile-time variable [即,不是常量] 的数组不匹配float T[][MAX], whenMAX是编译时常量。

它可能适用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);
于 2014-03-01T23:54:45.427 回答
0

正如其他答案所述,您可以做的是用 std::vector< vector < float >> 替换这些数组。我会使用 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;
}

注意 Symmetric 函数中 t 向量的初始化。不需要循环,因为所做的只是用行大小 n 声明它,并用一维浮点向量初始化每一行,一维数组中的每个条目都初始化为 0。

还要注意最后的测试。我所做的只是使用运算符 == 比较向量是否具有相等的分量。

使用上面的代码,我假设您的矩阵大小相同。如果没有,您将需要检查以确保这一点(我没有这样做)。

于 2014-03-02T00:09:33.173 回答