Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe: wer kennt Matrizenoperationen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
21.04.2009, 19:14 Uhr
Manfred-BW



Hallo zusammen,

mein Name ist Manfred und ich brauche Eure Hilfe bezüglich C++
und Matrizenbehandlung.
Bis jetzt konnte ich über Matrizen nur etwas über Multiplikationen finden,
aber nichts über Vergleichsoperationen.

Folgende Problemstellung:

Ich habe eine Matrize in welcher verschiedene Ziehungen von 6 Lottozahlen
stehen.

Nun geht es darum festzustellen, welche Zahlenkombinationen von 3 Zahlen
in dieser Matrize vorkommen und wie oft jede dieser Dreierkombinationen vorkommen.

Eine Zeile mit 6 Zahlen enthält 20 verschiedene Kombinationen aus 3 Zahlen.

Beispiel: 1-2-3-4-5-6 enthält folgende 20 Dreierkombinationen:
1-2-3
1-2-4
1-2-5
1-2-6
1-3-4
1-3-5
1-3-6
1-4-5
1-4-6
1-5-6
2-3-4
2-3-5
2-3-6
2-4-5
2-4-6
2-5-6
3-4-5
3-4-6
3-5-6
4-5-6

Die Aufgabe ist z.B. folgende Matrize zu untersuchen:

1 2 3 4 5 6
7 8 9 10 11 12
1 2 4 10 11 12
1 2 3 7 12 17
1 2 4 6 18 19
1 2 5 13 14 15
1 16 20 21 22 23
1 2 3 4 17 24
3 17 24 25 26 27
1 4 6 18 19 28

Welche verschiedenen Dreierkombinationen sind in dieser Matrize enthalten
und wie oft sind die verschiedenen Dreierkombinationen enthalten?

Dies kann man mit einer ganz einfachen For-Next Schleife mit Abfrage der
Übereinstimmungen durchführen.

Das Problem ist jedoch, daß die For-Next Schleife mit Zahlenvergleichen bei sehr
großen Zahlenbereichen mehrere Stunden braucht um zu einem Ergebnis zu kommen.

Ich habe nicht viel Ahnung von C-Programmierung, habe aber einen Ausschnitt von
einem Programm in C bekommen, welches das durchsuchen von 3000000
Zeilen und das feststellen der 17236 verschiedenen Dreierkombinationen innerhalb
von nur 20 Sekunden mit Hilfe der Matrizenoperation erledigt.

Wer kann mir folgenden Programmcodeausschnitt erklären?



I've obtained all triples from 3 000 000 lines with a matrix with 3 dimensions; here is that code but for all different triples:

(ich verstehe das so, daß hier nur die verschiedenen Dreierkombinationen erzeugt werden und deren Anzahl noch nicht
gezählt wird. Zum zählen bräuchte man dann vielleicht auch eine schnelle Matrizenoperation ? )


' Mit diesen For Schleifen werden nacheinander etwa 3000000 6er Kombinationen erzeugt die sofort einzeln untersucht werden
for(y1=2;y1<=4;y1++)
for(y2=y1+1;y2<=45;y2++)
for(y3=y2+1;y3<=46;y3++)
for(y4=y3+1;y4<=47;y4++)
for(y5=y4+1;y5<=48;y5++)
for(y6=y5+1;y6<=49;y6++)
{

' i = Zähler, die wievielte Kombination erzeugt wurde. Dient als Index
i++;

' ich denke in der folgenden Zeile wird die aktuelle Kombination von 6 Zahlen in eine Matrize m geschrieben
m[i][1]=y1;m[i][2]=y2;m[i][3]=y3;m[i][4]=y4;m[i][5]=y5;m[i][6]=y6;

' wozu dient folgende Zeile und was bedeutet sie?
if(i%1000000==0) cout<<i<<endl;

' wozu dient folgende Zeile ? Wird hier irgend etwas auf 1 normiert und warum? Was bedeutet das?
nr[y1]=1;nr[y2]=1;nr[y3]=1;nr[y4]=1;nr[y5]=1;nr[y6]=1;

' Die Variable cont1 ist ein Schalter. Wenn cont1 null bleibt wird später eine Matrizenoperation durchgeführt
cont1=0;

' mit den nächsten For-Schleifen werden die 20 Dreierkombinationen einer Zeile erzeugt
' die Werte der z1 bis z3 dienen im folgenden als Indizes
for(z1=1;z1<=4;z1++)
for(z2=z1+1;z2<=5;z2++)
for(z3=z2+1;z3<=6;z3++)
{

' nacheinander wird jede einzelne der 20 Dreierkombinationen untersucht ob irgend etwas ungleich Null ist
' durch welche Bedingung (in Worten) wird cont1 auf 100 gesetzt, damit nachfolgende Operation übersprungen wird.
' ist m2 eine neue Matrize für die Dreierkombinationen und was wird wie verglichen?
if(m2[m[i][z1]][m[i][z2]][m[i][z3]]!=0) cont1=100;

}
if(cont1==0)
{

' nochmals erzeugen der 20 verschiedenen Dreierkombinationen-Indizes
for(z1=1;z1<=4;z1++)
for(z2=z1+1;z2<=5;z2++)
for(z3=z2+1;z3<=6;z3++)
{

' was wird hier gemacht und erhöht? Ist das die Prüfung ob es die Dreierkombination
' in m2 noch nicht gibt (==0) und wie funktioniert dies so schnell mit Matrizen?
' braucht man kein "Then" für das If?
' was passiert genau mit ++ ?
if(m2[m[i][z1]][m[i][z2]][m[i][z3]]==0) m2[m[i][z1]][m[i][z2]][m[i][z3]]++;
}
}

}


Zusätzliche Fragen:
kann mir jemand ein vollständiges lauffähiges C- Programm daraus machen mit stdio usw?
Eventuell kann ich C in mein Basic Programm einbinden

Ist jemand in der Lage dieses Programm in Visual Basic darzustellen, so daß ich die Laufzeit im Vergleich
zu C testen kann?

Ich wäre für Eure freundlichen Erklärungen sehr dankbar

Manfred
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.04.2009, 23:01 Uhr
Hans
Library Walker
(Operator)


Hi,

also mit dem Porgrammausschnitt kann ich so auch nicht viel anfangen. Es wäre Hilfreich, wenn Du uns die Quelle nennst, wo Du das her hast und auch die Originalkommentare drin lässt.
Dann ist noch zu sagen, das der Begriff der Matrizen hier wenig mit den Matritzen aus der Mathematik zu tun hat. Um genau zu sein, nicht mehr, als das Daten über Indizes angesprochen werden.


Zitat:

' wozu dient folgende Zeile und was bedeutet sie?
if(i%1000000==0) cout<<i<<endl;


Nun, diese Zeile überprüft, ob eine Division durch einer Million glatt aufgeht, oder nicht. Wenn ja, dann wird der Wert von i ausgegeben. Da Du das nicht weist, solltest Du Dich wirklich erst mal mit den Grundlagen von C bzw. C++ beschäftigen, sonst wirst Du durch den Code nicht durchblicken, den Du hier gepostet hast. - Ach ja, und die Art der Kommentierung ist in Basic zwar richtig, in C und C++ aber nicht. Ein C/C++ Compiler wird Dir das mit "Syntax Error" um die Ohren hauen. Ansonsten wäre noch anzumerken, das der Code in C++ geschrieben ist, aber nicht in C.


Zitat:
kann mir jemand ein vollständiges lauffähiges C- Programm daraus machen mit stdio usw?

Sowas machen wir nur gegen Bezahlung, wenn überhaupt. Ansonsten darfst Du das selbst machen.


Zitat:
Eventuell kann ich C in mein Basic Programm einbinden

Das ist ein Kapitel für sich, das vergessen wir für den Anfang am besten mal gleich wieder weil das sonst zu kompliziert wird.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.04.2009, 18:07 Uhr
Manfred-BW



Hallo Hans,

erst mal danke für deine Antwort.

Daß ich von C generell wenig Ahnung habe, hatte ich ja extra erwähnt.

Deshalb bin ich ja mit Erklärungen auch zufrieden.

Vom Programmcode habe ich leider nicht mehr und alles ist ohne Kommentare.
Die Kommentare habe ich vom Wissen solcher Problemstellungen selbst erfunden
und die dürften nicht so falsch sein.

Ich dachte, daß zusammen mit der Problembeschreibung der Programmcode zu verstehen sein müßte
bzw. nachentwickelt oder zumindest erklärt werden könnte.

Extra C++ zu lernen, einen Compiler zu installieren und tagelang rumzuprobieren und dann doch nichts
zu verstehen ist dann doch wohl zu langwierig für mich, da ich ja auch noch berufstätig bin.

Natürlich ist es das sinnvollste, den Autor zu Fragen was er gemacht hat.
Ich habe dem Autor deshalb schon Fragen gestellt, aber leider keine Antworten bekommen.
Jeder Programmierer hat da wohl so seine Geheimnisse und ich verüble ihm das nicht.
Deshalb wende ich mich ja an dieses Forum.

Vielleicht kommt sonst jemand mit meinen Beschreibungen weiter?
Unten gibt es jetzt noch einige Zusatzinformationen.

Daß ein C++ Programm nur 5 Sekunden braucht und das schnelle GFA 32bit Basic viele Stunden,
kann nicht nur an den verschiedenen Programmen liegen sondern muß mit der speziellen
Programmroutine mit Matrizenrechnung oder Vektorprogrammierung zusammenhängen.

Ich kann in GFA32 Basic ebenfalls mit Matrizen und Zeigern programmieren, kann C-Code
und Assemblercode einbinden. Habe das jedoch noch nie gemacht und brauche deshalb erst
mal das Verständnis was den Beispielcode so schnell macht und wie er funktionieren könnte.

Weil das Beispiel in C++ ist, ist es doch wohl das sinnvollste, in einem C++ Expertenforum
nachzufragen, oder?

Die Aufforderung, erst mal C++ zu lernen, bringt mich überhaupt nicht weiter.
Da bitte ich doch um mehr Nachsicht.


Gruß, Manfred-BW



Ich habe noch folgende Informationen woraus man sieht nach welchem Prinzip er
programmiert. Das erste Programm sucht in einer Matrix mit 6 Nummern in einer
Reihe die 3er Kombinationen aus allen möglichen 18424 Dreierkombinationen
heraus, die NICHT in der Matrix vorhanden sind. Ich möchte aber diese
und nur diese welche vorhanden sind :

my program for missing triples use 3000 or 4000 triples and search in all 13 milions comb of 6 for that wich cover 20 triples because combs 6 to 3 =20;

but it doesn't seems like the process for 3 000 000 lines.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

the code for missing triple is very simple, this:

C++:
#include<stdio>
#include<iostream>
#include <time>
#include<stdlib>
#include<math>
#include<mbstring>
#include<string>

void main()
{
  int i,j,k,k1,b22;
  int **m;
  FILE *p,*q1;
  m=new int*[100000];

  for(i=0;i<100000;i++)
  {
    m[i]=new int[60];
  }

  if( (q1=fopen("c:\\Temp\\triples_frank.txt","w"))==NULL) exit(1);
  else b22=0;
  if( (p=fopen("c:\\Temp\\triple.txt","r"))==NULL) exit(1);
  else b22=0;

  int lcoloane=52;


  i=1;
  j=1;
  while(fscanf(p,"%d",&k)==1)
  {
    m[j][i++]=k;
    if(i==4)
    {
      i=1;
      j++;
    }
  }//copiere fisier
  fclose(p);
  int lmax=j;

  int n,n1,n2,j1,j2,s,s1,s2,s3,u1,cont;
  int x,x1,x2,x3,x4,x5,cont1;

  n=0;
  for(x=1;x<=45;x++)
    for(x1=x+1;x1<=46;x1++)
      for(x2=x1+1;x2<=47;x2++)
        for(x3=x2+1;x3<=48;x3++)
          for(x4=x3+1;x4<=49;x4++)
          //for(x5=x4+1;x5<=49;x5++)
          {
            n++;
            cont1=0;
            for(k=1;k<lmax;k++)
            {
              cont=0;
              for(k1=1;k1<3>5)
              {
                fprintf(q1,"%d\t%d\t%d\t%d\t%d\t%d\n",x,x1,x2,x3,x4,cont1);
                cout<<n<<endl;
              }
            }

            fclose(q1);

            delete m;
          }
}


read tre triples in a matrix;
generate combs one by one and pass throught all triples to see if the combs has 20 triples covered.

if find, print them

XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Folgender Programmausschnitt ermittelt innerhalb der 14Mio Zeilen von 6 aus 49
von der Zeile mit den Zahlen 2-4-20-32-39-41 (etwa Zeilen Nr. 2 Mio) bis zur Zeile mit den Zahlen 4-8-10-14- 15-48
etwa Zeilen Nr. 6Mio (ein Bereich von etwa 4Mio Zeilen) daraus 4126452 Dreierkombinationen die anschließend gezählt werden
und dann nur 2960 verschiedene Dreierkombinationen ergeben:


I've found between 2 milions and 6 milions lines from combs 49 to 6 only 2960 different triples;
I used the code for combs:

C++:
for(y1=2;y1<=4;y1++)
  for(y2=y1+1;y2<=45;y2++)
    for(y3=y2+1;y3<=46;y3++)
      for(y4=y3+1;y4<=47;y4++)
        for(y5=y4+1;y5<=48;y5++)
          for(y6=y5+1;y6<=49;y6++)


because the comb with no 2 mil. = 2-4-20-32-39-41
and with 4mil. is = 4-8-10-14- 15-48 and the choosen range is little more than it; y1 between 2 and 4 ;
I've obtain 4126452 combs and than 2960 different triples.

XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Das ist der code vom ersten Posting ohne Kommentare:

I've obtained all triples from 3 000 000 lines with a matrix with 3 dimensions; here is that code but for all different triples:

C++:
for(y1=2;y1<=4;y1++)
  for(y2=y1+1;y2<=45;y2++)
    for(y3=y2+1;y3<=46;y3++)
      for(y4=y3+1;y4<=47;y4++)
        for(y5=y4+1;y5<=48;y5++)
          for(y6=y5+1;y6<=49;y6++)
          {
            i++;
            m[i][1]=y1;m[i][2]=y2;m[i][3]=y3;m[i][4]=y4;m[i][5]=y5;m[i][6]=y6;
            if(i%1000000==0) cout<<i<<endl;
            nr[y1]=1;nr[y2]=1;nr[y3]=1;nr[y4]=1;nr[y5]=1;nr[y6]=1;
            cont1=0;
            for(z1=1;z1<=4;z1++)
              for(z2=z1+1;z2<=5;z2++)
                for(z3=z2+1;z3<=6;z3++)
                {
                  if(m2[m[i][z1]][m[i][z2]][m[i][z3]]!=0) cont1=100;
                }
            if(cont1==0)
            {
              for(z1=1;z1<=4;z1++)
                for(z2=z1+1;z2<=5;z2++)
                  for(z3=z2+1;z3<=6;z3++)
                  {
                    if(m2[m[i][z1]][m[i][z2]][m[i][z3]]==0) m2[m[i][z1]][m[i][z2]][m[i][z3]]++;
                  }
            }
          }


perhaps in 5 sec

For this lines I've obtained 2960 different triples

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt, Code eingerückt. Nächstes mal selbst machen, sonst kann das keine Sau lesen.


Dieser Post wurde am 22.04.2009 um 18:15 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.04.2009, 20:13 Uhr
0xdeadbeef
Gott
(Operator)


Der Code oben ist weder elegant noch richtig; ich könnte meinen Compiler hier nicht dazu überreden, das zu kompilieren (bindet nicht-existente Header ein, versucht, main void zurückgeben zu lassen), noch würde ich andernfalls erwarten, dass er funktioniert wie erwartet - es sollte spätestens bei

C++:
delete m;


absützen, weil der entsprechende Speicherbereich nicht mit new, sondern mit new[] angefordert wurde.

Nichtsdestoweniger kann ich aus dem Code sehen, was der Autor vorhatte; mit Matrizen hat es aber wenig zu tun. m2 ist...ich nenne es mal einen Prüfraum. Ich nehme an, dass er etwa als

C++:
int m2[50][50][50];


deklariert ist. Der Zähler, wie oft ein Tripel (x, y, z) entdeckt wurde, befindet sich dann an m2[x][y][z]. m ist eine Liste der durchlaufenen Ziehungen, m[i] die momentan betrachtete Ziehung. z1, z2 und z3 durchlaufen die Index-Kombinationen, die du im ersten Posting schon erwähnt hast; mit ihnen können dann aus m[i] die Tripel extrahiert und der Zähler in m2 bearbeitet werden. Dementsprechend ist

C++:
m2[m[i][z1]][m[i][z2]][m[i][z3]]


der Zähler des momentan betrachteten Tripels. Was der ganze cont-Kram soll, ist mir allerdings schleierhaft.

Wie dem auch sei, das ganze Problem ist relativ einfach in Code zu gießen, aber zum einen klingt es mir etwas hausaufgabig, und zum anderen - wenn du kein C++ verstehst, bringt es wenig, wenn ich dir C++-Code andrehe, der etwa macht, was du willst, weil du ihn eh nicht auf deinen use case anpassen kannst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.04.2009, 21:42 Uhr
~Manfred-BW
Gast


Danke für Deine Antwort, 0xdeadbeef.

wie macht man das, damit gepostetes in einem andersfarbigen
Fenster erscheint und hast Du die Einrückungen von Hand gemacht
oder mit dem C++ Programm??

Werde mir Deine Antworten genau ansehen, mal sehen ob die mich weiterbringen

Manfred-BW
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.04.2009, 22:01 Uhr
0xdeadbeef
Gott
(Operator)


Links neben dem Eingabefeld hier im Forum sind die Formatierungsmöglichkeiten aufgelistet, das cpp-tag ist für C++-Code gedacht. Für die Einrückung habe ich den Code durch indent gejagt, allerdings ist es generell sinnvoll, seinen Code gleich sinnvoll eingerückt zu schreiben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.04.2009, 22:04 Uhr
öni



Ich hab mich schon immer gefragt ob die Tags zum klicken sind, bei mir hat sich noch nie was getan, ich hab sie bis jetzt immer von Hand eingefügt. Wobei eigentlich ne javascript funktion dahinter liegen sollte, aber bei mir tut sich nichts. (FF 3.0.8)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.04.2009, 09:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von öni:
Ich hab mich schon immer gefragt ob die Tags zum klicken sind, bei mir hat sich noch nie was getan, ich hab sie bis jetzt immer von Hand eingefügt. Wobei eigentlich ne javascript funktion dahinter liegen sollte, aber bei mir tut sich nichts. (FF 3.0.8)

joa firefox hat da iwie probleme, muss ich mal überarbeiten damit das wieder geht
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.04.2009, 12:35 Uhr
~Manfred-BW
Gast


Hallo,

ich habe folgenden Text zu korrigieren:

"...Das erste Programm sucht in einer Matrix mit 6 Nummern in einer
Reihe die 3er Kombinationen aus allen möglichen 18424 Dreierkombinationen
heraus, die Nicht in der Matrix vorhanden sind. Ich möchte aber diese
und nur diese welche vorhanden sind..."

Diese Beschreibung ist falsch. Da war ich zu schnell beim posten.

Es muß heißen:

"...Das erste Programm lädt eine Tabelle mit Tripel ( ...frank), welche in allen seitherigen
Ziehungen im englischen Lotto 6 aus 49 noch nicht in den gezogenen Zahlen enthalten waren.
Dann sollen im Bereich aller 13983816 möglichen Lottozahlenkombinationen
alle diejenigen 6er (x bis x5) Zahlenkombinationen gefunden werden, welche möglichst
viel (maximal 20 mögliche) dieser fehlenden Tripel aus der Tabelle (frank) enthalten.
Funktioniert so aber nicht, da x5 auskommentiert ist..."

Gruß, Manfred-BW


Habe nun einen Text markiert und auf quote geklickt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.04.2009, 16:32 Uhr
Kest
saint


Hi!


Zitat von Manfred-BW:
wie oft sind die verschiedenen Dreierkombinationen enthalten?

Da braucht man nichts zu programmieren: n über k ist die Lösung. In diesen Fällen: 6 * 5 * 4 / 1 * 2 *3.

Der Code selbst ist aber zu übertrieben. Da kann man bestimmt einen Algorithmus finden.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: