Schwerpunkt von matrix

Gegeben, die ein 2D-array, bin ich verpflichtet zu kommen mit einem Algorithmus, der die Ausgänge der Mitte der Masse. Ich kam mit Algorithmus beschrieben, aber Sie produzieren falsche Lösung, wenn die array-Größe erhöht sich auf 10 x 10 matrix. Schrieb ich und lief den Algorithmus mit java. Ich habe nicht vorausgesetzt, die codes hier, sondern nur eine Erklärung, mein Algorithmus als ich fühle, dass es nicht richtig ist. Allerdings bin ich nicht in der Lage, um herauszufinden, warum.

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;

Weiß ich, dass es angeblich zu deal mit dem Mittelwert der Zeilen und Spalten. Also in meinem Algorithmus, finde ich das Mittel der Zeilen und Spalten, und dann die Durchführung der Berechnung oben gezeigt. Der gleiche algo gilt für die Spalten.

Jegliche Hilfe sehr geschätzt wird. Vielleicht, mein Verständnis von der Mitte der Masse ist falsch. Wenn etwas nicht klar ist, dann Fragen Sie. Dies ist meine eigenen Algorithmus, erstellt von meinem Verständnis der Mitte der Masse, also, wenn Ihr nicht klar ist, bitte Fragen. Danke!

  • Schau mal hier: en.wikipedia.org/wiki/Center_of_mass ich würde sagen, wenn man behandelt die Zellen als Partikel festgelegt, die in gleichem Abstand auf einer 2d-Ebene, die Sie sollten in der Lage sein, um die Anpassung der entsprechenden Gleichung.
  • Ihr Algorithmus nicht erwähnen Entfernung, die ausschlaggebend ist (Wortspiel beabsichtigt).
  • Zellen Bedeutung der einzelnen Werte in den 2d-array? Und verwenden Sie die Formel gefunden, unter system von Teilchen, und ersetzen Sie die m mit den Werten, die sich in der 2d-array und R ist nicht enthalten, da der Abstand gleich? Danke.
  • Ja-Zellen bedeutet die einzelnen Werte, position, definiert durch Spalte und Zeile die Indizes.
  • Hmmm..ich sah die Formel gegeben, bin aber nicht sicher, auf welchen Wert hinzufügen, wie einen Abstand, da dies ein 2D-array mit Werten von 0-1.
  • Die Formel gegeben?
  • In der wikipedia angegebenen link von Thomas, unter dem Abschnitt system von Teilchen. Ich kann nicht scheinen, um das kopieren und einfügen hier.
  • Haben Sie einen Blick auf meine Antwort unten. r(i) wäre die position in der matrix, definiert durch Spalte und Zeile index.

InformationsquelleAutor user3453250 | 2016-03-17



3 Replies
  1. 2

    Ausbau auf meinen Kommentar, Sie sollten in der Lage sein, die Berechnung der Mitte der Masse wie folgt:

    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

    Die Idee basiert auf dem Abschnitt „Ein system von Teilchen“ in https://en.wikipedia.org/wiki/Center_of_mass: behandeln Sie die matrix-Elemente in gleichem Abstand Partikel gelegt, die auf einer 2D-Ebene. Die position jedes Elements ist gleich seiner position innerhalb der matrix, also Spalte und Zeile, während die Masse des Partikels ist der Wert der Zelle/element/matrix-position.

    Beispiel-Implementierung mit Ihrem (jetzt gelöscht) test-case:

    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];

    Obigen Beispiel zurückkehren würde, Koordinaten 2/2 mit der Mitte der 5×5-matrix.

    • Obwohl centerOfMassValue ist von zweifelhaftem nutzen. Aber +1 für alles andere.
    • Ich habe gerade centerOfMassValue denn er bezog sich auf den Wert in der original-version der Frage. Es ist wahrscheinlich nicht viel, außer das 🙂
    • Hervorragende Erklärung. Ich danke Ihnen sehr, Thomas. Ich schien verstanden zu haben und hat den Algorithmus falsch.
  2. 1

    Sie tun müssen, um einen gewichteten Durchschnitt, also für ein 3×3-array,

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

    und ähnlich für y Austausch Spalten mit Zeilen.

    Einmal haben Sie die zwei Werte, die das paar von Ihnen werden Ihnen sagen, die x-und y-Koordinaten des Schwerpunktes für das array.

    Siehe Beispiel in dem folgenden link, wenn Sie brauchen eine visuelle Beispiel: http://www.batesville.k12.in.us/physics/APPhyNet/Dynamics/Center%20of%20Mass/2D_1.html

  3. 0

    Ich gehe davon aus, dass, da Sie die Speicherung der GEWICHTE in einer matrix, die die position in der matrix entsprechen den Koordinaten des Gewichts, wo die Spalte index ist x Zeile index y. So ein Gewicht auf Zeile=2,col=3 wir nehmen zu (3,2) auf der x/y-Koordinatensystem.

    Dieser code folgt Lösung für die Mitte der Masse, von der ein system von Teilchen auf Wikipedia:

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

    Voll funktionierenden code hier.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.