矩阵的质心

时间:2016-03-17 14:58:13

标签: java algorithm centroid

鉴于2D阵列,我需要提出一个输出质心的算法。我想出了下面的算法,然而,当阵列大小增加到10 x 10矩阵时,它会产生不正确的解决方案。我用java编写并运行了算法。我没有在这里提供代码,但只是对我的算法的解释,因为我觉得它不对。但是,我无法找出原因。

Store into an array: Mean of each row
Store into an array: Mean of each column

The algo below is used for row and column:
Loop through the row array,
if(row = 1){
value = (mean of row 1) - (mean of row 2 + mean of row 3+ mean of row 4)
}else if(row =Length of array){
value = (mean of row 1 + mean of row 2 + mean of row 3) - (mean of row 4)}
else{
value = (mean of rows until ith row) - (ith row till end of array)
}
final value = lowest value;

我知道它应该处理行和列的平均值。所以在我的算法中,我找出了行和列的方法,然后进行上面显示的计算。同样的算法适用于列。

感谢任何和所有帮助。也许,我对质心的理解是不正确的。如果事情不明确,那就问问吧。这是我自己的算法,是根据我对质心的理解而创建的,所以如果不清楚,请问。谢谢!

3 个答案:

答案 0 :(得分:2)

扩展我的评论,您应该能够按如下方式计算质心:

foreach col 
  foreach row
    massvector.x += matrix[col][row] * col
    massvector.y += matrix[col][row] * row
    totalmass += matrix[col][row]
massvector.x /= totalmass    
massvector.y /= totalmass

这个想法是基于"粒子系统"在https://en.wikipedia.org/wiki/Center_of_mass中:将矩阵元素视为在2D平面上布置的等间距粒子。每个元素的位置等于它在矩阵内的位置,即列和行,而粒子质量是该单元格/元素/矩阵位置的值。

示例 - 使用您的(现已删除的)测试用例实现:

double[][] matrix = new double[][]{
    {0.70,0.75,0.70,0.75,0.80},
    {0.55,0.30,0.20,0.10,0.70},
    {0.80,0.10,0.00,0.00,0.80},
    {0.70,0.00,0.00,0.00,0.80},
    {0.80,0.90,0.80,0.75,0.90}};

double cx = 0;
double cy = 0;
double m = 0;

for(int x = 0; x < matrix.length; x++ ) {
  for(int y = 0; y < matrix[x].length; y++) {
    cx += matrix[x][y] * x;
    cy += matrix[x][y] * y;
    m += matrix[x][y];
  }
}

//those are center's the cell coordinates within the matrix
int cmx = (int)(cx/m); 
int cmy = (int)(cy/m);

//whatever you'd need that value for (the position is more likely what you're after)
double centerOfMassValue = matrix[cmx][cmy];

上面的例子将返回坐标2/2,它是5x5矩阵的中心。

答案 1 :(得分:1)

您需要对3x3阵列进行加权平均,

x̄=(质量(col1)* 1 +质量(col2)* 2 +质量(col3)* 3)/(质量(col1)+质量(col2)+质量(col3))

,类似于y用行替换列。

一旦你有了这两个值,它们就会告诉你数组质心的x和y坐标。

如果您需要可视化示例,请参阅以下链接中的示例一:http://www.batesville.k12.in.us/physics/APPhyNet/Dynamics/Center%20of%20Mass/2D_1.html

答案 2 :(得分:0)

我假设由于您将权重存储在矩阵中,因此矩阵中的位置将与列索引 x 的权重坐标相对应。行索引为 y 。因此,在行= 2,col = 3的权重,我们将在x / y坐标系上取(3,2)。

此代码遵循维基百科上的solution for center of mass from a system of particles

public static Point2D.Double getCenterOfMass( double[][] matrix) {
    double massTotal = 0;
    double xTotal = 0;
    double yTotal = 0;
    for (int rowIndex = 0; rowIndex < matrix.length; rowIndex++) {
        for (int colIndex = 0; colIndex < matrix[0].length; colIndex++) {
            massTotal += matrix[rowIndex][colIndex];
            xTotal += matrix[rowIndex][colIndex] * colIndex;
            yTotal += matrix[rowIndex][colIndex] * rowIndex;
        }
    }
    xTotal /= massTotal;
    yTotal /= massTotal;
    return new Point2D.Double(xTotal,yTotal);
}

完整的工作代码here