3

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;

行と列の平均を処理することになっていることを知っています。したがって、私のアルゴリズムでは、行と列の平均を見つけてから、上記の計算を実行します。同じアルゴリズムが列に適用されます。

ありとあらゆる助けをいただければ幸いです。重心についての私の理解が間違っているのかもしれません。不明な点がある場合は、質問してください。これは私の重心の理解から作成した独自のアルゴリズムですので、不明な場合は質問してください。ありがとうございました!

4

3 に答える 3

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 マトリックスの中心に返されます。

于 2016-03-17T15:16:15.207 に答える
1

加重平均を行う必要があるため、3x3 配列の場合、

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

y についても同様に、列を行に置き換えます。

これらの 2 つの値を取得すると、それらのペアから配列の重心の x 座標と y 座標がわかります。

視覚的な例が必要な場合は、次のリンクの例 1 を参照してください: http://www.batesville.k12.in.us/physics/APPhyNet/Dynamics/Center%20of%20Mass/2D_1.html

于 2016-03-17T15:16:49.597 に答える
0

重みを行列に格納しているため、行列内の位置は、列インデックスがx行インデックスがyである重みの座標に対応すると仮定します。したがって、row=2,col=3 の重みは、x/y 座標系で (3,2) になります。

このコードは、ウィキペディアの粒子系からの質量中心の解に従います。

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);
}

完全な作業コードはこちら

于 2016-03-17T17:14:05.550 に答える