Methoden Mehrdimensionale Arrays übereinander legen

Jake14

Mitglied
Hallo, ich habe folgende Aufgabe:

Unbenannt.PNG

Unbenannt2.PNG

Nun komme ich seit Tagen nicht darauf, wie ich die Arrays übereinander legen kann. Ich soll ja offensichtlich nicht bei workArray[0][0] beginnen, sondern bei [1][1]. Wie kann ich die Methode gestalten, sodass sie filterArray nur an jene Stellen über workArray legt, bei denen filterArray auch nicht "über den Rand" geht?
 
Beste Antwort
Ich habe den Code jetzt so verändert, dass er auch mit längeren workArrays umgehen kann. Leider habe ich jetzt 4 Schleifen, aber es scheint zu funktionieren.
Du hast mit den Variablennamen natürlich recht, ich werde in Zukunft darauf achten.

Mein Code:
Java:
    private static double[][] applyFilter(double[][] workArray, double[][] filterArray) {
        // TODO: Implementieren Sie hier Ihre Lösung für die Methode
        double[][] filteredArray = new double[workArray.length][workArray[0].length];

        int filterHeightMiddle = (filterArray.length) / 2;
        int filterWidthMiddle = (filterArray[0].length) / 2;

        for (int l = 0; l <= workArray.length-filterArray.length ; l++) {
            for (int k = 0; k <=...
K

kneitzel

Gast
Wo genau ist Dein Problem und was waren bisher Deine Ansätze?

Und wenn ich das Bild anschaue, dann wird zuerst bei [0][0] angesetzt - also [0][0] vom workArray ist bei [0][0] vom filterArray.

Und wenn Du da die beiden Bilder anschaust: Wo ist denn beim zweiten Bild angesetzt? Da wirst Du doch bestimmt eine Gesetzmäßigkeit erkennen.

Und wie immer: teile und herrsche! Zerlege das Problem also in Teilprobleme, die dann von der Komplexität her beherrschbar werden für Dich.
 

Jake14

Mitglied
Wo genau ist Dein Problem und was waren bisher Deine Ansätze?

Und wenn ich das Bild anschaue, dann wird zuerst bei [0][0] angesetzt - also [0][0] vom workArray ist bei [0][0] vom filterArray.

Und wenn Du da die beiden Bilder anschaust: Wo ist denn beim zweiten Bild angesetzt? Da wirst Du doch bestimmt eine Gesetzmäßigkeit erkennen.

Und wie immer: teile und herrsche! Zerlege das Problem also in Teilprobleme, die dann von der Komplexität her beherrschbar werden für Dich.
Du hast recht, ich muss bei [0][0] starten. Ich hatte einen Denkfehler, bin jetzt aber auf dem richtigen Weg. Danke dafür!

Ich habe jetzt eine Methode, welche diese Aufgabe lösen kann, aber bei einem größeren workArray nicht mehr funktioniert:

Java:
    private static double[][] applyFilter(double[][] workArray, double[][] filterArray) {
        // TODO: Implementieren Sie hier Ihre Lösung für die Methode
        double[][] filteredArray = new double[workArray.length][workArray[0].length];

        int filterHeightMiddle = (filterArray.length) / 2;
        int filterWidthMiddle = (filterArray[0].length) / 2;

            for (int k = 0; k <= workArray[0].length-filterArray[0].length ; k++) {
                for (int i = 0; i < workArray.length; i++) {
                    for (int j = 0; j < filterArray.length; j++) {
                        filteredArray[filterHeightMiddle][filterWidthMiddle + k] += workArray[i][j + k] * filterArray[i][j];
                    }
                }
            }

        print(filteredArray);
        return filteredArray;
    }


    public static void main(String[] args) {

        double[][] workArray = new double[][] {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}/*, {0, 1, 2, 3}*/};
        double[][] filterArray = new double[][] {{1, 0, 0}, {1, 2, 0}, {0, 0, 3}};

        applyFilter(workArray, filterArray);

    }

Durch die for-Schleife in Zeile 9 würde "i" zu groß werden und ich erhalte eine out of bounds exception... Wie kann ich das korrigieren?
 
K

kneitzel

Gast
Was mich erst einmal stört sind die Variablennamen. Was ist k, i und j? Und Variablen mit einer gewissen Länge, die sich nur durch zwei Buchstaben unterscheiden, finde ich auch nicht wirklich gut. Aber auf den ersten Blick sieht der Code korrekt aus.

Der Fehler dürfte ein falscher Test sein, denn laut Aufgabe gilt immer:
Die length von workArray, filterArray und result (dein filteredArray) ist immer gleich. Also in dem Beispiel der Aufgabe ist die Höhe immer 3.
Wenn Du aber in workArray jetzt eine 4te Zeile einfügst, dann gilt dies nicht mehr.
==> Also die Teilarrays müssen länger werden ... 5, 6, 7 Elemente pro Array!


Kleiner Exkurs, weil ich es zuvor erwähnt hatte:
Generell ist es aber immer gut, die Komplexität gering zu halten: Teile und Herrsche!

Du baust da einen Algorithmus, der einfach zu komplex ist und so schwer zu überblicken ist. Ein Indiz dafür sind zu viele Verschachtelungen (Du hast da gleich drei Schleifen! In der Regel sollte es nur eine sein, maximal zwei!)

Ein Vorgehen ist die "Top Down Methode":
Schreibe den Algorithmus High-Level auf. Was ist das denn dann?
Sowas wie
- Erzeuge Ergebnis Matrix (Das 2d Array würde ich als Matrix bezeichnen.... Array ist ein Datentyp. Dein Name ist ja auch Dein Name und nicht String. Also sagst Du ja auch nicht: "Wie ist Dein String?"
- Für jede Verschiebeposition:
---> Berechne Filter-Summe
---> Speicher Filter Summe in ErgebnisMatrix

Und das kannst Du direkt in Code umsetzen:
Java:
double[][] ergebnis = erzeugeErgebnisMatrix(....);
for (int verschiebung: berechneAlleVerschiebePositionen(...)) {
  double summe = berechneSumme(...);
  speichereSummeInMatrix(.....);
}

Was Du in den jeweiligen Methoden brauchst, ist dabei noch nicht festgelegt... also entweder keine Argumente angeben oder ich habe es durch ... aufgezeigt ...

Damit hast Du den Algorithmus der Aufgabe ... Du musst nur noch die Methoden schreiben:
- erzeugeErgebnisMatrix ist einfach - bekommt die original Matrix übergeben und erzeugt eine Neue mit gleicher Größe.
- berechneAlleVerschiebePositionen - da habe ich schon etwas vorgegriffen: Da ist der Typ int. Aber wir geben da mehrere int zurück. Das könnte also z.B. eine List<Integer> sein aber auch ein int[] würde funktionieren. An der Stelel dann wichtig. einfache Dinge kann man in die Methode gerne wieder rein ziehen. Dann wäre das z.B. wieder eine for Schleife wie Du sie schon hast. ==> Aus diversen Gründen würde ich das nicht machen, aber falls Du Probleme mit der for each Schleife hast, dann mache daraus eine normale for Schleife....
- berechneSumme berechnet dann nur noch die Summe der Multiplikationen. Der Name gefällt mir nicht. Es ist ja eine Filter Operation an einer Stelle ... berechneFilter oder so wäre dann eher besser ....
- speichereSummeInMatrix erklärt sich dann von alleine ...

So hast Du dann viele kleine Methoden, die Du auch einzeln prüfen kannst.

(Das geht auch Bottom Up, d.h. Du überlegst einmal, was Du so an Operationen brauchst und implementierst dann von unten nach oben. Dann weisst Du auch immer, was Du für die Methoden an Parameter brauchst ... Das Vorgehen spielt aber keine Rolle. Ich wollte es nur einmal kurz gesagt haben!)
 
K

kneitzel

Gast
Der Fehler dürfte ein falscher Test sein, denn laut Aufgabe gilt immer:
Die length von workArray, filterArray und result (dein filteredArray) ist immer gleich. Also in dem Beispiel der Aufgabe ist die Höhe immer 3.
Wenn Du aber in workArray jetzt eine 4te Zeile einfügst, dann gilt dies nicht mehr.
==> Also die Teilarrays müssen länger werden ... 5, 6, 7 Elemente pro Array!
Ich glaube das habe ich doch falsch gelesen. Das ist doch keine Bedingung.

Du musst die Schleife, die die Berechnung durchführt, in den richtigen Grenzen laufen lassen.
Du hast Drei Schleifen:
- k ist die Schleife mit dem Versatz ... Aber erst in eine Richtung!
- i/j sollen die Berechnungen durchführen. Dabei werden aber natürlich die Grenzen des filterArrays verwendet und nicht des workArrays!

Also darf i nur die Grenzen des filterArray nutzen und du brauchst noch eine Schleife für den zweiten Versatz,


Also einfach einmal aufzeichnen, was Du machen musst.

Du fängst erst in der ersten spalte an (Versatz vertikal 0) um da dann die Zeile abzuarbeiten (Horizontalen Versatz von 0 an durchgehen ...)
Dann gehst Du in die nächste Spalte (Versatz vertikal ist dann 1) und machst es erneut.
 

Jake14

Mitglied
Ich habe den Code jetzt so verändert, dass er auch mit längeren workArrays umgehen kann. Leider habe ich jetzt 4 Schleifen, aber es scheint zu funktionieren.
Du hast mit den Variablennamen natürlich recht, ich werde in Zukunft darauf achten.

Mein Code:
Java:
    private static double[][] applyFilter(double[][] workArray, double[][] filterArray) {
        // TODO: Implementieren Sie hier Ihre Lösung für die Methode
        double[][] filteredArray = new double[workArray.length][workArray[0].length];

        int filterHeightMiddle = (filterArray.length) / 2;
        int filterWidthMiddle = (filterArray[0].length) / 2;

        for (int l = 0; l <= workArray.length-filterArray.length ; l++) {
            for (int k = 0; k <= workArray[0].length - filterArray[0].length; k++) {
                for (int i = 0; i < filterArray.length; i++) {
                    for (int j = 0; j < filterArray.length; j++) {
                        filteredArray[filterHeightMiddle + l][filterWidthMiddle + k] += workArray[i + l][j + k] * filterArray[i][j];
                    }
                }
            }
        }
        return filteredArray;
    }
 
Beste Antwort
Ähnliche Java Themen
  Titel Forum Antworten Datum
N mehrdimensionale arrays Java Basics - Anfänger-Themen 12
J Mehrdimensionale Arrays Java Basics - Anfänger-Themen 2
melaniemueller Lagerverwaltung erstellen - mehrdimensionale Arrays Java Basics - Anfänger-Themen 62
F Mehrdimensionale Arrays Java Basics - Anfänger-Themen 12
G Mehrdimensionale Arrays Java Basics - Anfänger-Themen 17
T Mehrdimensionale Arrays mit geschachtelter for-Schleife initialisieren Java Basics - Anfänger-Themen 14
L mehrdimensionale arrays ich verzweifle so langsam... Java Basics - Anfänger-Themen 9
C Mehrdimensionale Arrays in Java langsam? Java Basics - Anfänger-Themen 8
D Mehrdimensionale Arrays Sortieren Java Basics - Anfänger-Themen 5
T Mehrdimensionale Arrays Java Basics - Anfänger-Themen 4
B mehrdimensionale arrays Java Basics - Anfänger-Themen 4
B mehrdimensionale Arrays Java Basics - Anfänger-Themen 5
J eclipse, mehrdimensionale arrays, hilfsmethoden Java Basics - Anfänger-Themen 3
S arraycopy für mehrdimensionale Arrays? Java Basics - Anfänger-Themen 8
B Mehrdimensionale Arrays Java Basics - Anfänger-Themen 4
T mehrdimensionale arrays Java Basics - Anfänger-Themen 8
H Mehrdimensionale Arrays vergleichen Java Basics - Anfänger-Themen 6
G Zwei mehrdimensionale Arrays multiplizieren Java Basics - Anfänger-Themen 9
J Mehrdimensionale Arrays inhaltlich vergleichen. Java Basics - Anfänger-Themen 3
D mehrdimensionale nicht-rechteckige Arrays Java Basics - Anfänger-Themen 2
T Mehrdimensionale Array Java Basics - Anfänger-Themen 2
putinator Mehrdimensionale Array addieren Java Basics - Anfänger-Themen 10
D 2 mehrdimensionale Matrix einlesen Java Basics - Anfänger-Themen 2
T .add(E) für mehrdimensionale Vectoren Java Basics - Anfänger-Themen 5
H mehrdimensionale Datenstruktur erfassen Java Basics - Anfänger-Themen 10
L Mehrdimensionale Array Java Basics - Anfänger-Themen 4
A Mehrdimensionale Felder Java Basics - Anfänger-Themen 18
D Mehrdimensionale ArrayList - Zugriff über return Java Basics - Anfänger-Themen 2
B Mehrdimensionale Array Problem Java Basics - Anfänger-Themen 12
J Mehrdimensionale Liste erstellen ohne Array Java Basics - Anfänger-Themen 14
V Mehrdimensionale Collection? Java Basics - Anfänger-Themen 4
J Mehrdimensionale Array kopieren Java Basics - Anfänger-Themen 6
G Mehrdimensionale ArrayList erstellen Java Basics - Anfänger-Themen 7
D mehrdimensionale ArrayList ? Java Basics - Anfänger-Themen 14
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste und Arrays Java Basics - Anfänger-Themen 12
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
S Hilfe bei Praktischen Aufgaben von Arrays Java Basics - Anfänger-Themen 39
T Objekte mit arrays erstellen Java Basics - Anfänger-Themen 6
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
M Arrays Java Basics - Anfänger-Themen 3
Ostkreuz Wert von Arrays summieren Java Basics - Anfänger-Themen 1
Ostkreuz Summieren von Arrays Java Basics - Anfänger-Themen 4
javaBoon86 Arrays 2 Dimension Werte ausgeben Java Basics - Anfänger-Themen 15
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
B bei 2 Arrays Anzahl gleicher Elemente vergleichen? Java Basics - Anfänger-Themen 49
JustAProgrammer Ein Dreieck mit Arrays erstellen Java Basics - Anfänger-Themen 2
TheSepp Nur Arrays ausgeben, die Werte zugewiesen haben. Java Basics - Anfänger-Themen 4
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
rosima26 Geordnete Arrays ausgeben Java Basics - Anfänger-Themen 31
D Inhalt eines Arrays ausgeben Java Basics - Anfänger-Themen 7
A Jedes zweite Element eines Arrays entfernen Java Basics - Anfänger-Themen 30
C Zwei Arrays addieren und ausgeben Java Basics - Anfänger-Themen 3
E Zinsrechnung mithilfe von Arrays Java Basics - Anfänger-Themen 12
LePetitChat1 Arrays - NullPointerException? Java Basics - Anfänger-Themen 14
H Arrays: Größten Zahlen Unterschied herausfinden Java Basics - Anfänger-Themen 20
H Arrays befüllen Java Basics - Anfänger-Themen 43
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
D Arrays Java Basics - Anfänger-Themen 9
C Java Arrays - Ausgabe in Methode Java Basics - Anfänger-Themen 12
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
N Arrays Java Basics - Anfänger-Themen 5
W n verschiedene Arrays zufällig ausgeben - mit der Random-Klasse? Java Basics - Anfänger-Themen 8
U zwei 2D arrays auf gleich sein überprüfen Java Basics - Anfänger-Themen 14
C initialisieren eines arrays richtiger Größe und mit geeignetem Datentyp Java Basics - Anfänger-Themen 26
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
A Arrays aufsummieren Java Basics - Anfänger-Themen 11
C Wie 2 Arrays zusammenfügen und sortieren? Java Basics - Anfänger-Themen 11
S Arrays aneinanderketten Java Basics - Anfänger-Themen 20
Sinan Arrays auflisten ohne Wiederholung Java Basics - Anfänger-Themen 28
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
R Werte und Reihenfolge in 2d Arrays vergleichen Java Basics - Anfänger-Themen 5
D Verschlüsslungsaufgabe / Arrays Java Basics - Anfänger-Themen 6
L Methode für Zweidimensionale Arrays Java Basics - Anfänger-Themen 4
L Methode zum invertieren eines Arrays Java Basics - Anfänger-Themen 7
S zweidimensionale char arrays Java Basics - Anfänger-Themen 14
D Verwirrung bei Streams aus primitiven Arrays Java Basics - Anfänger-Themen 2
P Arrays mit verschiedenen Längen miteinander dividieren. Java Basics - Anfänger-Themen 1
P Wie kann ich die Zahlen dieses Arrays dividieren? Java Basics - Anfänger-Themen 2
N 2D Arrays jedes xy vergleichen Java Basics - Anfänger-Themen 7
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
Kawastori Größe eines Arrays bestimmen Java Basics - Anfänger-Themen 13
Zeppi Arrays[i] Java Basics - Anfänger-Themen 7
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
J B-Sprache mit Arrays ausführen Java Basics - Anfänger-Themen 18
A Teilarrays eines 2D-Arrays sortieren Java Basics - Anfänger-Themen 4
C Arrays - deklarieren, initialisieren? Ist das ein Objekt? Java Basics - Anfänger-Themen 3
K Sudoku mit 2D Arrays Java Basics - Anfänger-Themen 19
T Vertikales Histogramm mit Arrays Java Basics - Anfänger-Themen 3
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
Z Kein überprüfen des gesamten Arrays möglich.(Viergewinnt Spiel) Java Basics - Anfänger-Themen 6
F Arrays: Mathematische Funktion Java Basics - Anfänger-Themen 19
mihe7 Von Datentypen und (mehrdimensionalen) Arrays Java Basics - Anfänger-Themen 4
A Teilen eines Arrays Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben