Einfache Möglichkeit, diese Matrix zu füllen?

7

Ich möchte eine n * n (n ist ungerade) Matrix auf folgende Weise füllen:

%Vor%

Was ist eine einfache Methode, dies mit Mathematica zu tun?

    
Mr.Wizard 21.11.2011, 08:50
quelle

5 Antworten

12

Mit dieser Hilfsfunktion:

%Vor%

Wir können die Matrix als

konstruieren %Vor%

Um die von Ihnen beschriebene Matrix zu erhalten, verwenden Sie

%Vor%

Die Idee dahinter ist, das Muster zu untersuchen, dem die Positionen aufeinanderfolgender Zahlen 1 .. folgen. Sie können sehen, dass diese die Zyklen bilden. Der nullte Zyklus ist trivial - enthält eine Zahl 1 an der Position {0,0} (wenn wir Positionen von der Mitte aus zählen). Der nächste Zyklus wird gebildet, indem die erste Zahl (2) an der Position {1,-1} genommen wird und nacheinander die folgenden Schritte hinzugefügt werden: {0, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 0} (wenn wir uns um die Mitte bewegen). Der zweite Zyklus ist ähnlich, aber wir müssen mit {2,-2} beginnen, jeden der vorherigen Schritte zweimal wiederholen und den sechsten Schritt (aufwärts) hinzufügen, der nur einmal wiederholt wird: {0, -1} . Der dritte Zyklus ist analog: Beginne mit {3,-3} , wiederhole alle Schritte 3 mal, außer {0,-1} , was nur zweimal wiederholt wird. Die Hilfsfunktion makeSteps automatisiert den Prozess. In der Hauptfunktion müssen wir dann alle Positionen zusammenfassen und dann {cycles, cycles} hinzufügen, da sie vom Zentrum aus gezählt wurden, das eine Position {cycles,cycles} hat. Schließlich konstruieren wir die SparseArray aus diesen Positionen.

    
Leonid Shifrin 21.11.2011, 11:04
quelle
8

Ich kenne die Mathematica-Syntax nicht, aber ich denke, Sie könnten einen Algorithmus wie diesen verwenden:

%Vor%

Sie können diesen Algorithmus auch ziemlich einfach in eine funktionale Version oder in eine Tail-Rekursion umwandeln.

Nun, Sie müssen in der while-Schleife einchecken, wenn Sie nicht auch außerhalb der Grenzen sind. Wenn n ungerade ist, kannst du einfach num up zählen während:

%Vor%

Ich bin mir ziemlich sicher, dass es einen einfacheren Algorithmus gibt, aber das ist der intuitivste für mich.

    
PeterT 21.11.2011 10:05
quelle
4

Die magischen Zahlen auf der Diagonale, beginnend bei 1 und aufwärts gehend, können von

erreicht werden %Vor%

Damit sollte es einfach sein, ein SparseArray einzurichten. Ich werde ein bisschen herumspielen und sehen, wie schwer das ist.

    
Timo 21.11.2011 10:25
quelle
4

Erste Version:

%Vor%

Bearbeiten

Ein besserer:

%Vor%     
Dr. belisarius 22.11.2011 22:53
quelle
3

Eine Teillösung mit Bildverarbeitung:

%Vor%

    
Dr. belisarius 21.11.2011 18:09
quelle