Foreach und for - Schleife

FabianLurz

Bekanntes Mitglied
Hallo Leute,
ich habe ein seltsames Problem (vllcht aber auch nicht). Ich habe folgende Funktion:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main.java.math.vectorOperations;

import static java.lang.Math.sqrt;
import java.util.ArrayList;
import java.util.Arrays;

/**
 *
 * @author Fabian
 */
public class CosineSimilarity {
    //Variables for createCosineSimilarity

    ArrayList<Integer> row1 = new ArrayList<>();
    ArrayList<Integer> row2 = new ArrayList<>();
    ArrayList<Byte> val1 = new ArrayList<>();
    ArrayList<Byte> val2 = new ArrayList<>();
    private int poscounter1 = 0;
    private int poscounter2 = 0;
    private boolean result1 = false;
    private boolean result2 = false;
    private boolean break1 = false;
    private boolean break2 = false;

    /**
     * Creates the Similarity between two items of the following position
     *
     * @param col The col positions
     * @param row The row positions
     * @param val The values
     * @param position1 id1
     * @param position2 id2
     * @return Similarity
     */
    public float createCosineSimilarity(int[] col, int[] row, byte[] val, int position1, int position2) {
        int maximum = 0;         
        for (int i:col) {
            if (col[i] == position1) {
                val1.add(poscounter1, val[i]);
                row1.add(poscounter1, row[i]);
                poscounter1++;
                //result1 = true;
                if (row[i] > maximum) {
                    maximum = row[i];
                }
            }
            if (col[i] == position2) {
                val2.add(poscounter2, val[i]);
                row2.add(poscounter2, row[i]);
                poscounter2++;
                //result2 = true;
                if (row[i] > maximum) {
                    maximum = row[i];
                }
            }
            /*if (result1 == true) {
                break1 = true;
            }
            if (result2 == true) {
                break2 = true;
            }
            if (break1 == true && break2 == true && result1 == false && result2 == false) {
                break;
            }
            result1 = false;
            result2 = false;*/
        }
        byte[] vector1 = new byte[maximum + 1];
        byte[] vector2 = new byte[maximum + 1];

        final int size1 = val1.size();
        final int size2 = val2.size();

        for (int y = 0; y <= maximum; y++) {
            for (int z = 0; z < size1; z++) {
                if (row1.get(z) == y) {
                    vector1[y] = val1.get(z);
                    break;
                } else {
                    vector1[y] = 0;
                }
            }
        }
        for (int x = 0; x <= maximum; x++) {
            for (int t = 0; t < size2; t++) {
                if (row2.get(t) == x) {
                    vector2[x] = val2.get(t);
                    break;
                } else {
                    vector2[x] = 0;
                }
            }
        }
        row1.clear();
        row2.clear();
        val1.clear();
        val2.clear();
        poscounter1 = 0;
        poscounter2 = 0;
        break1 = false;
        break2 = false;
        return Similarity(vector1, vector2);
    }
    //Variables for Similarity
    private float dotProduct = 0;
    private float vector1Square = 0;
    private float vector2Square = 0;
    private double eucledianDist = 0;
    private float result = 0;

    /**
     * Calculates the similarity between two vectors
     *
     * @param A First vector
     * @param B Second vector
     * @return Similarity
     */
    private float Similarity(byte[] A, byte[] B) {
        final int ALenght = A.length;
        for (int i = 0; i < ALenght; i++) {
            dotProduct += (A[i] * B[i]);
            vector1Square += (A[i] * A[i]);
            vector2Square += (B[i] * B[i]);
        }
        eucledianDist = (sqrt(vector1Square) * sqrt(vector2Square));
        if (dotProduct != 0 && eucledianDist != 0) {
            result = dotProduct / (float) eucledianDist;
        } else {
            result = 0;
        }
        dotProduct = 0;
        vector1Square = 0;
        vector2Square = 0;
        eucledianDist = 0;
        return result;
    }
}
Ihr seht ja folgende Schleife: for (int i:col)
Wenn ich statt der foreach Schleife eine for Schleife nehme, bekomme ich andere Werte.
Zur Erklärung. Ich berechne die Kosinusähnlichkeit einer x-y Matrix (Sparse matrix - Wikipedia, the free encyclopedia)

Ich durchsuche das array col nach position1 bzw. position2 (dies kann auch mehrfach besetzt sein). An dieser Stelle wird dann der rowindex gespeichert und der dazugehörige Wert val1 bzw val2.
Anschließend setze ich row1+val1 und row2+val2 zu einem Vektor und berechne daraus die Kosinusähnlichkeit.

Was mich eben wundert: Für die for-Schleife erhalte ich andere Werte als für die foreach-Schleife. Vllcht. ist das auch normal, weil die foreach eben iterativ arbeitet...vllcht aber auch nicht :)
Hoffe auf antworten ;)
Gruß Fabian
 
M

Marcinek

Gast
Mal mit Debugger dran gehen. Oder mal debugausgaben einfügen.

Wie sieht die for Schleife aus?
 

miasma

Aktives Mitglied
Du vermodelst da auch beide Varianten in einer: Bei der foreach-Schleife kriegst du ja die Werte und nicht den index im Array...

HTH,
Johannes
 

FabianLurz

Bekanntes Mitglied
Also die for normale for-Schleife würde so aussehen:
for(int i=0;i<col.length;i++)
Debuggen werde ich jetzt heute noch ja; werde dann über die Ausgaben noch berichten.
Ich dachte, es gibt ein bekanntes Problem damit.
Ich "vermodel" hier auch nichts ;) Das ist schon richtig so, dass es beide sind. Ich muss ja wieder Vektoren bilden und da macht eine foreach - Schleife keinen Sinn.
Achso und ich hatte eben gehofft (wenn man auf die Uhrzeit meines Posts sieht), dass es einen absolut offensichtlichen Fehler gibt, der zu beheben ist :)
Gruß Fabian :)
 

FabianLurz

Bekanntes Mitglied
Ok das dachte ich mir;also muss die Abfrage if(i==position1) lauten oder?
Aber was mache ich hier: val2.add(poscounter2, val);
 
Zuletzt bearbeitet:

JCODA

Top Contributor
Wenn du den Index brauchst, ist die Foreach-Schleife nunmal der falsche Weg. Da du eben keinen Index hast.
 

FabianLurz

Bekanntes Mitglied
Naja ich könnte erst die i-werte speichern und danach erst die werte rausholen mit einer weiteren schleife.
Dann werden es zwar insgesamt paar mehr Schleifen. Aber die Iteration bei 80k Werten ist mehr als sinnvoll, da sie 80k*80k wiederholt wird.
EDIT: Nein stimmt das geht auch nicht....Muss doch aber noch eine Lösung dafür geben.
 
Zuletzt bearbeitet:

TKausL

Top Contributor
Nimm die normale for. Da hast du dann den Index und intern wirds auch nicht anders gemacht, also ändert sich an der Performance nichts,
 

FabianLurz

Bekanntes Mitglied
Sieht wohl so aus :(
Es ist schon ein bisschen zum verzweifeln. Ich will einfach eine bessere Performance. Ich habe eben soo viele Werte und ich habe diese versucht in allen Möglichen Varianten zu speichern. Habe eben die x-y Matrix (CCR) genommen und diese dann einmal in TreeMap(das bringt natürlich nichts) einmal in HashMap gespeichert. Aber nichts bringt einen Vorteil an der Performance. Denke ich muss mich wohl damit abfinden dass 80K*80K (ca. es schwankt ) Berechnungen eben einfach ihre Zeit brauchen :) Was ich aber definitiv noch versuche, ist die Similarity() Funktion mit einer Iteration auszustatten. Evtl. bringt das noch einen Vorteil :)
EDIT: Falles sich hierfür noch jemand interessiert; mit dieser Codeänderung habe ich die Berechnungszeit nochmal halbiert:
Java:
private float Similarity(byte[] A, byte[] B) {
        final int ALenght = A.length;
        for (int vec1 : A) {
            vector1Square += (vec1 * vec1);
        }
        for (int vec2 : B) {
            vector2Square += (vec2 * vec2);
        }
        eucledianDist = (sqrt(vector1Square) * sqrt(vector2Square));
        if (eucledianDist == 0) {
            return 0;
        } else {
            for (int i = 0; i < ALenght; i++) {
                dotProduct += (A[i] * B[i]);
            }
            result = dotProduct / (float) eucledianDist;
        }
        dotProduct = 0;
        vector1Square = 0;
        vector2Square = 0;
        eucledianDist = 0;
        return result;
    }
Das dotProduct wird nur berechnet, wenn es Werte enthält.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
GilbertGrape foreach Schleife Allgemeine Java-Themen 12
Monokuma Foreach Schleifen in Streams umändern Allgemeine Java-Themen 23
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
D Ant foreach Allgemeine Java-Themen 0
R foreach oder nicht? Allgemeine Java-Themen 4
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
A For-Schleife Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
1 Klassen Variabel aus Schleife übergeben Allgemeine Java-Themen 8
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
K For-Schleife <> oder != Operator verwenden? Allgemeine Java-Themen 2
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
D While-Schleife - if Zweig unterbrechen Allgemeine Java-Themen 1
F Zweifache For-Schleife Allgemeine Java-Themen 6
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
M While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt Allgemeine Java-Themen 3
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
T for - Schleife Allgemeine Java-Themen 1
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
R Komplizierte Schleife Allgemeine Java-Themen 1
Q For-Schleife in String-Value Allgemeine Java-Themen 3
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
P Erweiterte For Schleife Allgemeine Java-Themen 7
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
Y automatisierte for Schleife Allgemeine Java-Themen 13
B For schleife und weiter? Allgemeine Java-Themen 8
D Probleme bei for-Schleife Allgemeine Java-Themen 4
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
N Frage zur while-Schleife Allgemeine Java-Themen 18
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
F for-Schleife mit : Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
S for-Schleife, while-Schleife Problem Allgemeine Java-Themen 6
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R while schleife auf 3 durchgänge beschränken Allgemeine Java-Themen 6
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
x22 for-Schleife Allgemeine Java-Themen 76
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
J Schleife mit : Allgemeine Java-Themen 18
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
S Do-While Schleife bricht nicht ab Allgemeine Java-Themen 3
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
K CheckBox schleife Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
R In einer for Schleife bei einem Substring anfangen, wo man davor aufgehört hat Allgemeine Java-Themen 6
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
D Sterne Muster mit einer Schleife Allgemeine Java-Themen 5
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
hdi Detail-Frage zur for-Schleife Allgemeine Java-Themen 9
J Thread pausieren, lange while-Schleife Allgemeine Java-Themen 8
Q Variable aus Schleife/Switch benutzen Allgemeine Java-Themen 7
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
C Geschachtelte For-Schleife: Äußere Schleife wird nur einmal durchlaufen!? Allgemeine Java-Themen 3
W While-ESC-Schleife funktioniert nicht Allgemeine Java-Themen 3
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
H Threads.... ich will aus der While-Schleife raus Allgemeine Java-Themen 6
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
J Schachbrett mit for- oder while-Schleife Allgemeine Java-Themen 22
I For- Schleife falsch? Allgemeine Java-Themen 8
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5
V Problem in While-Schleife Allgemeine Java-Themen 3
Escorter Switch in der Schleife! Allgemeine Java-Themen 4
C Auswertung der for each schleife? Allgemeine Java-Themen 2
J FOR-Schleife-Problem Allgemeine Java-Themen 10
G Schleife durch Button beenden Allgemeine Java-Themen 6
S Schleife funktioniert nicht Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
T getParameter in while schleife Allgemeine Java-Themen 3
O while - Schleife unterbrechen mit break; Allgemeine Java-Themen 5
R array.length in For-Schleife verwenden? Allgemeine Java-Themen 22
V Schleife funktioniert nicht wie gewünscht Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben