我有一个矩阵程序,到目前为止输入一个输入文件并表示矩阵中的数字。我还写了一个函数来找到它的转置,但我无法弄清楚如何做对称。
我只需要输入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;
}
答案 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;
}