Fallunterscheidungen Matrix und Skalarprodukt



  • Hallo

    Ich habe eine Matrix A mit m Zeilen und n Spalten, sowie eine Matrix B mit p Zeilen und n+1 Spalten, ferner ist p größer als m. In der A Matrix sind alle Koeffizienten binäre, also 0 oder 1. In der B Matrix ist die erste Spalte eine natürliche Zahl zwischen 0 und m (das gleiche m wie die Zeilenzahl von A) und die restlichen n Spalten sind hier ebenfalls binär. Die natürlichen Zahlen in der ersten Spalten kommen mehrfach vor.

    Hier ein Beispiel wie die Matrizen aussehen können:

    A-Marix:
    0 0 0
    1 1 0
    0 0 1
    1 1 1

    B-Marix:
    1 0 0 0
    2 1 0 0
    2 0 1 0
    2 1 1 0
    3 0 0 1
    4 1 0 1
    4 0 1 1
    4 1 1 1

    Mein Ziel ist nun das Skalarprodukt von jedem (binären!) Zeilenvekor aus B (also ohne die erste Spalte) mit demjenigen Zeilenvektor aus A zu berechnen, dessen Zeilenindex gegeben ist durch die natürliche Zahl aus der ersten Spalte der B-Matrix.

    Im Beispiel:
    (0 0 0) aus A multipliziert mit (0 0 0) aus B, weil die 1 in der ersten Spalte in der ersten Zeile nur einmal vorkommt. Dann (1 0 0) mal (1 1 0) sowie (0 1 0) mal (1 1 0) und (1 1 0) mal (1 1 0) weil die Zwei in drei Zeilen von B steht und diese Zwei den zweiten Zeilenvektor aus A repräsentiert. Dann das selbe Vorgehen einmal für die Drei und zuletzt Drei mal für die Vier.

    Am Ende möchte ich so eine (m x p)-Matrix C erhalten, in der alle diese Skalarprodukte stehen.

    Mein Hauptproblem ist nun, dass ich konzeptionell nicht weiss wie so etwas zu programmieren ist. Von Hand ist ganz klar was ich meine und wie das geht, aber wie programmiert man das?

    Danke für die Hilfe und Grüße



  • for(int i = 0; i < bRowCount; ++i) {
       int aIndex = bMatrix[i][0];
       int prod = std::inner_product(&bMatrix[i][1], std::end(bMatrix[i]), &aMatrix[aIndex]);
    }
    

    So in der Art. Je nach dem, welche Matrix-Klassen du benutzt, Boundary-Checks brauchst etc. noch beliebig anders.



  • Hi

    Dieser Code führt zu folgendem Fehler:

    error: no matching function for call to ‘inner_product(__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type&, std::vector<int>::iterator, __gnu_cxx::__alloc_traits<std::allocator<std::vector<int> > >::value_type&)’
    

    Was bedeuet dies?


  • Mod

    Mach halt ein &* vor das std::end oder benutz so etwas wie std::next(std::begin(bMatrix[i]), 1) als ersten Parameter. Ungetestet.

    Außerdem fehlt noch der Initialwert (0?). Wenn du fremden Code benutzt, musst du ihn auch verstehen. Dazu gehört auch, wenigstens mal die Referenz einer Standardfunktion anzugucken.



  • Deswegen frage ich hier ja nach Erklärung, denn offensichtlich weiss ich nicht wie der Code funktioniert.

    Wie mich diese arrogante Pseudo "Hilfe" ankotzt....


  • Mod

    Pfft. Wenn du nicht einmal die Antworten vollständig liest, dann hilf dir doch alleine.



  • Wo habe ich denn bitte eine Antwort nicht vollständig gelesen?

    Ich weiss weder wie das mit den Templates funktioniert, was überall in den Referenzen angegeben ist, noch weiss ich wie hier das & und * zu interpretieren ist, obwohl ich gefühlt Tausend mal das Kapitel über Pointer in meinem Lehrbuch gelesen habe, noch verstehe ich die Syntax von inner_product und weisst du was mich am meisten ankotzt?! Wenn andere Leute etwas nicht kennen, dann nehme ich mir die Zeit und erkläre es richtig, ohne diesen süffisant überheblichen Ton in den "Hilfen". Ich habe Physik studiert und wenn z.B. jemand etwas über Relativität oder QM wissen will, erlkäre ich das den Leuten und mach hier nicht einen auf arrogant und "ist ja eh klar, mach halt xyz, wiel es ja so trivial ist...."

    Bei so etwas bekomme ich gut Lust einfach wie du sagst es alleine zu versuchen, zu scheitern, aber meine Hilfe dann auch auf Null zu setzen, wenn andere etwas wollen....


  • Mod

    Wo habe ich denn bitte eine Antwort nicht vollständig gelesen?

    Ich habe dir eine vollständige Antwort auf deine Frage gegeben und du nennst das Pseudo-Hilfe. In der Zeit bis zur Antwort hast du offensichtlich nicht einmal versucht, die Antwort nachzuvollziehen, denn selbst einfaches Ausprobieren, geschweige denn Nachschlagen der Funktionen, hätte viel länger gedauert.

    Ich weiss weder wie das mit den Templates funktioniert, was überall in den Referenzen angegeben ist, noch weiss ich wie hier das & und * zu interpretieren ist, obwohl ich gefühlt Tausend mal das Kapitel über Pointer in meinem Lehrbuch gelesen habe, noch verstehe ich die Syntax von inner_product

    Warum ist deine Frage dann nicht, dass du Templates nicht verstehst, Pointer nicht verstehst, usw.?

    Nein, du wolltest, dass dir jemand den Code, den jemand anderes für dich geschrieben hat, für dich zum laufen bringt. Wobei du offensichtlich nicht einmal versucht hast, die Funktion zu verstehen. Ob das aus Unwissen oder Faulheit geschah, können wir nicht wissen. Fakt ist, du hast uns einfach nur die Fehlermeldung serviert und gesagt: Macht mal für mich! Und wenn jemand dieses Verhalten beim Namen nennt, reagierst du wie eine beleidigte Leberwurst.



  • Was du mir hier unterstellst! 😡

    Ich habe diese Fehlermeldung gepostet mit Zitat: "Was bedeuet dies?" und erhoffte, dass mir jemand erklärt was dieser Fehler bedeutet und erklärt wie es dazu kommt.

    Ich habe kein Interesse an fertigen Lösungen sondern will C++ lernen und was ich überhaupt nicht ab kann ist dieser Überheblichkeit und Arroganz hier.

    Das wars für mich.


  • Mod

    cpp_Jungspund schrieb:

    Ich habe diese Fehlermeldung gepostet mit Zitat: "Was bedeuet dies?" und erhoffte, dass mir jemand erklärt was dieser Fehler bedeutet und erklärt wie es dazu kommt.

    Du zeigst leidlich wenig Eigeninitiative. Du musst außerdem lernen, Fehlermeldungen wie diese selbst geschwind zu verstehen. Und selber zu recherchieren.

    Ich habe kein Interesse an fertigen Lösungen

    Aber wir reden von einem fast trivialen Problem, und du schreibst

    Mein Hauptproblem ist nun, dass ich konzeptionell nicht weiss wie so etwas zu programmieren ist. Von Hand ist ganz klar was ich meine und wie das geht, aber wie programmiert man das?

    Was für eine Art von Rat möchtest du? Außer fertigen Code?



  • cpp_Jungspund schrieb:

    Was du mir hier unterstellst! 😡

    Ich habe diese Fehlermeldung gepostet mit Zitat: "Was bedeuet dies?" und erhoffte, dass mir jemand erklärt was dieser Fehler bedeutet und erklärt wie es dazu kommt.

    Ich habe kein Interesse an fertigen Lösungen sondern will C++ lernen und was ich überhaupt nicht ab kann ist dieser Überheblichkeit und Arroganz hier.

    Das wars für mich.

    Tja, manche wollen hier nur zeigen, wie toll sie sind. Aber man kann trotzdem von einigen dieser Leute lernen.
    Aber davon abgesehen, warum probierst Du nicht einfache Schleifen?

    #include <array>
    #include <cstddef>
    #include <iostream>
    using namespace std;
    
    int main() {
      constexpr size_t m = 4;
      constexpr size_t n = 3;
      constexpr size_t p = 8;
    
      array<array<int, n>, m> A {{ 
          {{0, 0, 0}}, 
          {{1, 1, 0}},
          {{0, 0, 1}},
          {{1, 1, 1}} 
        }};
      array<array<int, n+1>, p> B {{ 
          {{1, 0, 0, 0}}, 
          {{2, 1, 0, 0}},
          {{2, 0, 0, 0}},
          {{2, 1, 1, 0}},
          {{3, 0, 0, 1}}, 
          {{4, 1, 0, 1}},
          {{4, 0, 1, 1}},
          {{4, 1, 1, 1}}
        }};
      array<array<int, p>, m> C {{ {0} }}; 
    
      for(size_t im = 0; im < m; ++im) {
        // hier die Matrixelemente von C aufbauen
        for(size_t ip = 0; ip < p; ++ip) {
          auto index = B[ip][0] - 1;
          // usw. usw.. 
    
        }
      }
    
    }
    

    Scheint mir am klarsten und übersichtlichsten.


Anmelden zum Antworten