Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

1

17.09.2015, 17:11

Orthogonale Matrix mit Zeilenvekotren gleicher Norm

Hallo

Ich möchte gerne versuchen das folgende Programm zu schreiben:

Ich will eine Matrix erstellen lassen, mit L Zeilen und N Spalten. Die Zeilenvektoren sollen orthogonal zueinander sein, also kanonisches Skalarprodukt Null. Die Norm eines jeden Zeilenvektors soll gleich sein. Das bedeutet, dass in einer Zeile nun mehre 1 er stehen dürfen, in jeder Zeile aber gleich viel. Ferner darf wegen der Orthogonalität in keiner Spalte mehr als eine 1 stehen. Die Anzahl der 1 er die in den Zeilen stehen möchte ich dabei als Parameter steuern können. Natürlich muss dieser so gewählt sein, dass die Matrix noch so existiert.

Die C++ Implementierung davon möchte ich selbst versuchen. Woran ich allerdings gerade scheitere ist das konzeptionelle, numerische Vorgehen wie ich so eine Matrix konstruieren könnte.

Danke für Tipps und Grüße

MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

2

17.09.2015, 17:15

Was meinst du mit Konzept? Zwei-dimensionale Arrays bieten sich doch für dein Vorhaben an.

Dann zerlegst du die einzelnen Abfragen in ein paar Methoden, z.b. countNumberOneColumn(int column), countNumberOneRow(int row) und versuchst damit dann die Aufgabenstellung Schritt-für-Schritt zu lösen.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

17.09.2015, 17:28

Wenn ich es richtig verstehe ist das doch nur eine Erweiterung des vorherigen Problems. Was sich ändert ist das du jetzt x 1en pro Zeile aus der Sequenz nimmst.

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

4

18.09.2015, 01:31

Kaum zu fassen aber ich habe es hinbekommen. Wohuu :)

Hier mein Code den ich dazu setzte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//Programm erstellt binäre (L x N) Matrix, Zeilenvektoren zueinander orthogonal, Jeder Vektor hat gleiche Norm
//N muss durch I*L teilbar sein (I=Zahl der 1er pro Zeile
#include <iostream> 
#include <stdlib.h>
#include <vector>
#include <iterator>
#include <stdlib.h>
#include <algorithm>
#include <sstream>

#define ADSIZE 16           //Anzahl der Spalten
#define MAX_MUSTER 4       //Anzahl der Zeilen
#define I 4               //Zahl der 1-er in den Zeilenvektoren der Muster

using namespace std;
//=============================================
//Fisher-Yates-Shuffle-Algorithmus
void FisherYates(std::vector<int>& vec)
{
    int n = vec.size();
    for (int i = n - 1; i > 0; --i)
    {
        std::swap(vec[i], vec[rand() % (i + 1)]);
    }
}
//=============================================
int main () {                                      
int ik,il;

int Sequenz[ADSIZE];
for(il=0; il<ADSIZE; il++){Sequenz[il]=il;}

vector<int> sequenz;
sequenz.insert( sequenz.begin() , Sequenz , Sequenz + ADSIZE ) ; 

FisherYates(sequenz);
//std::copy(sequenz.begin(), sequenz.end(), std::ostream_iterator<int>(std::cout, " "));

vector< vector<int> > muster( MAX_MUSTER,vector<int>(ADSIZE) );

//Setze zueinander orthogonale Zeilenvektoren mit gleicher Norm
std::stringstream sstr;
int z;
z=ADSIZE/I;
il=0;

for(ik=0; ik<MAX_MUSTER; ik++)
{   
   
   for(sstr.str()[il]; il<z; il++)
   {
   muster[ik][sequenz[il]]=1;          
   }  
z=z+I;
}

//Ausgabe der zueinander orthonormalen Zeilenvektoren
for(ik=0; ik<MAX_MUSTER; ik++)
{
    for(il=0; il<ADSIZE; il++)
    {
    cout << " " << muster[ik][il];
    }
cout << "\n";
}

//=============================================
return 0;                                                                                             
}
//=============================================

Werbeanzeige