C矩阵计划

时间:2013-05-26 20:23:27

标签: c matrix symmetric

我有一个矩阵程序,到目前为止输入一个输入文件并表示矩阵中的数字。我还写了一个函数来找到它的转置,但我无法弄清楚如何做对称。

我只需要输入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; 
}

2 个答案:

答案 0 :(得分:0)

众所周知,浮点数易于舍入错误。如果sqrt的结果仅略低于预期结果,则对floor的调用将使其(几乎)1关闭。尝试在取平方根之前将1添加到大小。这是安全的,如果大小是正方形数,将保证正确的结果。

建议的更改:

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

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

答案 1 :(得分: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方法获取整个矩阵,并尝试找出尺寸并检查对称性。

现在请看THIS CODE。我为此写了一个简单的主函数。正如你所看到的,它有效。所以问题应该是在程序中生成转置矩阵或给定大小的方法。

算法的另一个问题:您无法从元素的数量中找到维度。 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; 
}