Maths 2D-3D Matrix

Share your advanced PureBasic knowledge/code with the community.
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Maths 2D-3D Matrix

Post by Guimauve »

Code updated For 5.20+

Hello everyone. For one of my top secret project I need to create a 3D Matrix to store some data. I have added the 2D matrix and some basic operation at the same time.

You are free to use, edit or modify. I hope this code can be usefull for some one.

Regards
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<