Maths - Matrice 3D

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Maths - Matrice 3D

Message par Guimauve »

Bonjour à tous.

Pour un de mes projets classifiés, j'ai eu besoin de créer une Matrice en 3D. Pour vous expliquer brièvement, Matrix3D est un gros cube remplis de petit cube. Chaque petit cube représente une valeur. Dans le prototype ci-dessous, le gros cube fait 5X5X5 et chaque petit cube est réel double précision.

Il y a également une Matrice 2D ainsi que quelques opérations de base.

Vous êtes libre de faire ce que vous voulez avec ce code.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Matrice à 2 ou 3 Dimensions
; Fichier : Code Prototype à ajuster au besoin.
; Version : 1.0.0
; Programmation = OK
; Programmé par : Guimauve
; Date : 10-09-2006
; Mise à jour : 10-09-2006
; Codé avec PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#Array_Size = 5

Structure Vector
  
  Coords.d[#Array_Size]
  
EndStructure

Structure Matrix2D
  
  Lines.Vector[#Array_Size]
  
EndStructure

Structure Matrix3D
  
  Stratums.Matrix2D[#Array_Size]
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Access macros >>>>>

Macro AccessMatrix2D(MatrixA, i, j)
  
  MatrixA\Lines[i]\Coords[j]
  
EndMacro

Macro AccessMatrix3D(MatrixA, i, j, k)
  
  MatrixA\Stratums[i]\Lines[j]\Coords[k]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Plus operator R = A + B >>>>>

Macro PlusMatrix2D(MatrixR, MatrixA, MatrixB)
  
  For i = 0 To #Array_Size -1
    For j = 0 To #Array_Size -1
      AccessMatrix2D(MatrixR, i, j) = AccessMatrix2D(MatrixA, i, j) + AccessMatrix2D(MatrixB, i, j) 
    Next
  Next
  
EndMacro

Macro PlusMatrix3D(MatrixR, MatrixA, MatrixB)
  
  For i = 0 To #Array_Size -1
    For j = 0 To #Array_Size -1
      For k = 0 To #Array_Size -1
        AccessMatrix3D(MatrixR, i, j, k) = AccessMatrix3D(MatrixA, i, j, k) + AccessMatrix3D(MatrixB, i, j, k) 
      Next
    Next
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Minus operator R = A - B >>>>>

Macro MinusMatrix2D(MatrixR, MatrixA, MatrixB)
  
  For i = 0 To #Array_Size -1
    For j = 0 To #Array_Size -1
      AccessMatrix2D(MatrixR, i, j) = AccessMatrix2D(MatrixA, i, j) - AccessMatrix2D(MatrixB, i, j) 
    Next
  Next
  
EndMacro

Macro MinusMatrix3D(MatrixR, MatrixA, MatrixB)
  
  For i = 0 To #Array_Size -1
    For j = 0 To #Array_Size -1
      For k = 0 To #Array_Size -1
        AccessMatrix3D(MatrixR, i, j, k) = AccessMatrix3D(MatrixA, i, j, k) - AccessMatrix3D(MatrixB, i, j, k) 
      Next
    Next
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Zero operator >>>>>

Macro ZeroMatrix2D(MatrixA)
  
  RtlZeroMemory_(MatrixA, SizeOf(Matrix2D))
  
EndMacro

Macro ZeroMatrix3D(MatrixA)
  
  RtlZeroMemory_(MatrixA, SizeOf(Matrix3D))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Copy operator From MatrixA to MatrixB >>>>>

Macro CopyMatrix2D(MatrixA, MatrixB)
  
  CopyMemory(MatrixA, MatrixB, SizeOf(Matrix2D))
  
EndMacro

Macro CopyMatrix3D(MatrixA, MatrixB)
  
  CopyMemory(MatrixA, MatrixB, SizeOf(Matrix3D))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Compare operator >>>>>

Macro CompareMatrix2D(MatrixA, MatrixB)
  
  CompareMemory(MatrixA, MatrixB, SizeOf(Matrix2D))
  
EndMacro

Macro CompareMatrix3D(MatrixA, MatrixB)
  
  CompareMemory(MatrixA, MatrixB, SizeOf(Matrix3D))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Read binary file >>>>>

Macro ReadMatrix2D(FileID, MatrixA)
  
  ReadData(FileID, MatrixA, SizeOf(Matrix2D))
  
EndMacro

Macro ReadMatrix3D(FileID, MatrixA)
  
  ReadData(FileID, MatrixA, SizeOf(Matrix3D))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Write binary file >>>>>

Macro WriteMatrix2D(FileID, MatrixA)
  
  WriteData(FileID, MatrixA, SizeOf(Matrix2D))
  
EndMacro

Macro WriteMatrix3D(FileID, MatrixA)
  
  WriteData(FileID, MatrixA, SizeOf(Matrix3D))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Je ne sais pas du tout a quoi ca sert !!!

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Ça sert pour des calculs de maths complexe. C'est juste un manière d'organiser les données et c'est pas catastrophique si tu ne sais pas à quoi ça peut servir.

Un exemple on voudraient faire des transformations 3D et on voudraient placer toutes les valeur dans une seule variable (Matrice3D). Dans ce cas, il faudrait dimensionner le vecteur à 4, la matrice 2D à 4 et la matrice 3D au nombre de transformation à effectuer, 6 par exemple. Bien sur la matrice 3D n'est plus un cube mais une boite 4X4X6.

Bref, c'est ça l'idée générale derrière cet astuce. Mais c'est plutôt rare que l'on doivent faire des trucs de ce genre.

Mais attention, la quantité de mémoire augement de façon exponentielle avec le nombre de dimension. Exemple Matrice de type double (.d) selon les dimensions

2D 100X100 occupe 80 000 d'octets
3D 100X100X100 occupe 8 000 000 d'octets
4D 100X100X100X100 occupe 800 000 000 d'octets
5D 100X100X100X100X100 occupe 80 000 000 000 d'octets

On peut défoncer la mémoire facilement.

A+
Guimauve
Répondre