矩阵的质心
Centroid of matrix
给定一个二维数组,我需要想出一个输出质心的算法。我想出了下面的算法,但是,当数组大小增加到 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;
我知道它应该处理行和列的平均值。所以在我的算法中,我找出行和列的均值,然后进行如上所示的计算。相同的算法适用于列。
感谢您提供的所有帮助。也许,我对质心的理解是不正确的。如果有什么不清楚的,那就问吧。这是我自己的算法,根据我对质心的理解创建的,所以如果不清楚,请尽管问。谢谢!
扩展我的评论,您应该能够按如下方式计算质心:
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 中的 "A system of particles" 部分:将矩阵元素视为在 2D 平面上布置的等距粒子。每个元素的位置等于它在矩阵中的位置,即列和行,而粒子质量是该 cell/element/matrix 位置的值。
使用您的(现已删除)测试用例的实施示例:
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];
上面的例子 return 坐标 2/2 是 5x5 矩阵的中心。
您需要对 3x3 数组进行加权平均,
x̄= (质量(col1)*1 + 质量(col2)*2 + 质量(col3)*3) / (质量(col1) + 质量(col2) + 质量(col3))
对于 y 类似地用行替换列。
获得这两个值后,这两个值将告诉您阵列质心的 x 和 y 坐标。
如果您需要视觉示例,请参阅下面的示例一link:http://www.batesville.k12.in.us/physics/APPhyNet/Dynamics/Center%20of%20Mass/2D_1.html
我假设由于您将权重存储在矩阵中,所以矩阵中的位置将对应于列索引为 x 行索引的权重坐标是 y。因此 row=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。
给定一个二维数组,我需要想出一个输出质心的算法。我想出了下面的算法,但是,当数组大小增加到 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;
我知道它应该处理行和列的平均值。所以在我的算法中,我找出行和列的均值,然后进行如上所示的计算。相同的算法适用于列。
感谢您提供的所有帮助。也许,我对质心的理解是不正确的。如果有什么不清楚的,那就问吧。这是我自己的算法,根据我对质心的理解创建的,所以如果不清楚,请尽管问。谢谢!
扩展我的评论,您应该能够按如下方式计算质心:
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 中的 "A system of particles" 部分:将矩阵元素视为在 2D 平面上布置的等距粒子。每个元素的位置等于它在矩阵中的位置,即列和行,而粒子质量是该 cell/element/matrix 位置的值。
使用您的(现已删除)测试用例的实施示例:
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];
上面的例子 return 坐标 2/2 是 5x5 矩阵的中心。
您需要对 3x3 数组进行加权平均,
x̄= (质量(col1)*1 + 质量(col2)*2 + 质量(col3)*3) / (质量(col1) + 质量(col2) + 质量(col3))
对于 y 类似地用行替换列。
获得这两个值后,这两个值将告诉您阵列质心的 x 和 y 坐标。
如果您需要视觉示例,请参阅下面的示例一link:http://www.batesville.k12.in.us/physics/APPhyNet/Dynamics/Center%20of%20Mass/2D_1.html
我假设由于您将权重存储在矩阵中,所以矩阵中的位置将对应于列索引为 x 行索引的权重坐标是 y。因此 row=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。