我正在尝试以百分比形式计算具体矩阵的对称性。
计算对称性的“传统”方式将是,我输入任意大小为N×N的方阵M作为输入,并且如果M [i,j] = M [,则算法的输出必须为真(=对称)。 j,i]对于所有j≠i,否则为false。
如何适当地计算百分比?因此,不只是说对称还是不对称?也许计数j≠i的时间,然后将其除以(i,j)的总数?
所以如果我具有以下矩阵:
1 1 1 1 1 1
A = 2 2 2 B = 2 2 2
1 1 2 3 4 5
那么我需要知道A比B“更对称”,即使两者都是不对称。
答案 0 :(得分:3)
您应该首先定义每个单元格的对称距离度量。如果对称像元相同,则应为零;否则,则为其他数字。
例如:
s(i,j):= (m(i,j)==m(j,i) ? 0:1) // returns 0/1 if the symmetric cell is/isn't the same
或
s(i,j):= |m(i,j)-m(j,i)| // returns the absolute difference between the two cells
然后将所有单元格的距离求和:
int SymmetricDistance(matrix){
for (int i=0; i<matrix.Width; i++)
for (int j=i; j<matrix.Width; j++) // check if th matrix is square first
dist = dist + s(i,j);
return dist;
}
现在您可以说矩阵A比矩阵B“更对称”
SymmetricDistance(A) < SymmetricDistance(B)
答案 1 :(得分:1)
我总体上同意@Sten Petrov的回答。但是,如果您要寻找对称的百分比:
首先,找到在 NxN 矩阵中可以对称的元素对的总数。
您可以通过沿对角线拆分矩阵并计算元素数来找到此值。由于将 1 添加到 N 会使对总数增加 N ,因此查找总对的一般规则是对1中的数字求和到N。但是,不是循环,而是使用sum公式:
Total Possible = N * (N + 1) / 2
矩阵是完全对称的 iff 所有对都是对称的。因此,对称性百分比可以定义为对称对占总可能对的比例。
Symmetry = Symmetric Pairs / Total Pairs
伪代码:
int matchingPairs= 0;
int N = matrix.Width;
int possiblePairs = N * (N + 1 ) / 2;
for(int i = 0; i < N; ++i){
for(int j = 0; j <= i; ++j){
matchingPairs += (matrix[i][j] == matrix[j][i]) ? 1 : 0;
}
}
float percentSymmetric = matchingPairs / possiblePairs ;