2

我有一个矩阵程序,到目前为止,它接受一个输入文件并用矩阵表示数字。我还写了一个函数来找到它的转置,但我不知道如何做对称。

我只需要取 3 个输入参数(MainMatrix[max][max] MainTranspose[max][max] 和 Size)

如果它不是对称的,它应该返回 -1,如果是,它应该返回 0。

我的程序显示一切正确,除了 1 表示它应该是不对称的。

我希望你们中的一个可以帮助我解决这个问题。

int Symmetry (int mainmatrix[max][max], int maintranspose[max][max], int size) {
    double thesqrtSize = sqrt((double)Size);
    double fract = thesqrtSize - floor(thesqrtSize);
    if(fract > 0.0001) 
        return -1;
    int isqrtSize = (int)thesqrtSize;
    int i, j;
    for(i=0;i<isqrtSize;i++){
        for(j=0;j<isqrtSize;j++) {
            if(mainmatrix[i][j]!=maintranspose[i][j]) {
                return -1; 
            }
        }
    }
    return 0; 
}
4

2 回答 2

0

众所周知,浮点数容易出现舍入错误。如果 sqrt 的结果只是比预期的结果低一点点,则调用floor将使其(几乎)1。在取平方根之前尝试将 size 加 1。这是安全的,并且如果大小是平方数,将保证正确的结果。

建议的更改:

double thesqrtSize = sqrt((double)(Size+1));

显然,这意味着您floor用于检查垂直度的方法将不起作用。我建议转换为 int,平方,并与原始大小进行比较,看看它们是否相同。

于 2013-05-26T20:32:22.237 回答
0

对称函数不需要转置矩阵。没有它你可以找到答案:

int Symmetry (int mainmatrix[max][max], int size) {
    int isqrtSize= (int)sqrt((double)size);
    if(isqrtSize*isqrtSize!=size) 
        return -1;
    int i, j;
    for(i=0;i<isqrtSize;i++){
        for(j=0;j<isqrtSize;j++) {
            if(mainmatrix[i][j]!=mainmatrix[j][i]) {
                return -1; 
            }
        }
    }
    return 0; 
}

您没有以最优雅的方式解决多维数组参数问题,但让我们使用它。我认为您的程序可能会以这种方式工作:

  • 你声明一个最大尺寸的矩阵
  • 您填充矩阵的左上角并检查对称性
  • symmetry方法获取整个矩阵并尝试找出维度并检查对称性。

现在请参阅此代码。我为此编写了一个简单的 main 函数。如您所见,它有效。所以问题应该出在生成转置矩阵的方法上或程序中给定的大小上。

该算法的另一个问题:您无法从元素的数量中找到维度。一个 8*2 的矩阵包含 16 个元素,因此该方法将像处理 4*4 矩阵一样查看和处理它。如果没有这样的情况,您可以使用上面的代码。

但是:当你调用对称函数时,你计算的大小为size=rows*columns,所以你必须知道矩阵的大小。这意味着,您也可以简单地将它们赋予您的功能。在这种情况下,您不必计算 sqrt 和其他浮点值,您只需检查输入参数是否相等。有了这个,函数将如下所示:

int Symmetry (int mainmatrix[max][max], int rows, int cols) {
    if(rows!=cols)
        return -1;
    int i, j;
    for(i=0;i<rows;i++){
        for(j=0;j<cols;j++) {
            if(mainmatrix[i][j]!=mainmatrix[j][i]) {
                return -1; 
            }
        }
    }
    return 0; 
}
于 2013-05-26T20:50:37.367 回答