Zum Forum springen
Benachrichtigungen
Alles löschen

C/C++ Zeiger auf Array - Interpretation in Java

3 Beiträge
3 Benutzer
0 Reactions
526 Ansichten
thortoOn
Beigetreten: 17.04.2009

Hi,

ich hab ein Neuronales Netz trainiert und kann das nur als C exportieren, will es aber gern direkt in Java-Code haben.

MAT_INOUT ist eine Matrix/ein zweidimensionales Array, die V_... Vektoren/Arrays.

void ComputeFeedForwardSignals(double* MAT_INOUT,double* V_IN,double* V_OUT,double* V_BIAS,int size1,int size2,int layer) {
  int row,col;
  for(row=0;row < size2; row++)      {
    V_OUT[row]=0.0;
    for(col=0;col<size1;col++)
      V_OUT[row]+=(*(MAT_INOUT+(row*size1)+col)*V_IN[col]);
    V_OUT[row]+=V_BIAS[row];
    if(layer==0) V_OUT[row] = logistic(V_OUT[row]);
    if(layer==1) V_OUT[row] = exp(V_OUT[row]);
  }
}

Bin totaler C-/Informatik-Cretin.
Was steht in der Zeile mit MAT_INOUT? Was macht der Stern? Gefühlt muss ja das korrekte Element aus der Matrix genommen werden, aber ich habe keine Idee wie sich irgendein Zeiger in Verbindung mit einem Array verhält.
V_OUT[row] += V_IN[col] * MAT_INOUT[row][col] scheint falsch zu sein.

Vielen Dank.


Antwort
Zitat
2 Antworten
knuddelhundi
Beigetreten: 26.09.2007

Original von thortoOn
Hi,

ich hab ein Neurales Netz trainiert und kann das nur als C exportieren, will es aber gern direkt in Java-Code haben.

MAT_INOUT ist eine Matrix/ein zweidimensionales Array, die V_... Vektoren/Arrays.

void ComputeFeedForwardSignals(double* MAT_INOUT,double* V_IN,double* V_OUT,double* V_BIAS,int size1,int size2,int layer) {
  int row,col;
  for(row=0;row < size2; row++)      {
    V_OUT[row]=0.0;
    for(col=0;col<size1;col++)
      V_OUT[row]+=(*(MAT_INOUT+(row*size1)+col)*V_IN[col]);
    V_OUT[row]+=V_BIAS[row];
    if(layer==0) V_OUT[row] = logistic(V_OUT[row]);
    if(layer==1) V_OUT[row] = exp(V_OUT[row]);
  }
}

Bin totaler C-/Informatik-Cretin.
Was steht in der Zeile mit MAT_INOUT? Was macht der Stern? Gefühlt muss ja das korrekte Element aus der Matrix genommen werden, aber ich habe keine Idee wie sich irgendein Zeiger in Verbindung mit einem Array verhält.
V_OUT[row] += V_IN[col] * MAT_INOUT[row][col] scheint falsch zu sein.

Vielen Dank.

In der Zeile setzt du den Pointer um (row*size1) + col vorwärts, derefenzierst ihn dann damit du auf den eigentlichen double Wert im Array kommst. Den multiplizierst du dann mit V_IN[col].

Im Prinzip sagt der Ausdruck:

1. Verschiebe den Pointer auf das jeweilige Element in der Matrix
2. Gib mir den Wert der hinter der berechneten Pointeradresse steht

Der eigentliche Pointer ist nur eine Adresse mit der du nichts in deinem Array berechnen kannst. Das Sternchen derefenziert die Adresse in deiner Zuweisung.

http://manderc.manderby.com/operators/pointerarithmetic/index.php

edit:

V_OUT[row] += V_IN[col] * MAT_INOUT[row][col]

für den Ausdruck müsste MAT_INOUT so definiert sein:

void ComputeFeedForwardSignals(double** MAT_INOUT,double* V_IN,double* V_OUT,double* V_BIAS,int size1,int size2,int layer)

Ansonsten ist MAT_INOUT nur ein eindimensionales Array.


Antwort
Zitat
MisterJ
Beigetreten: 26.03.2006

Das ist äquivalent zu:

V_OUT[row] += MAT_INOUT[row*size1 + col] * V_IN[col];

MAT_INOUT ist ein 1d array der Größe size1*size2 und wird dementsprechend indiziert.


Antwort
Zitat