3.1.2.2 : Le fichier source
Écrivons le fichier temporary_alloc.cpp :
Nous commençons, bien sur, par inclure le
header que nous venons d'écrire :
1
|
#include "temporary_alloc.h"
|
Et nous implémentons notre fonction d'initialisation (avec la documentation, j'insiste) :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
///Allocate temporary
/** @param[out] tmpU1 : matrix temporary U
* @param[out] tmpU2 : matrix temporary U
* @param[out] tmpV1 : matrix temporary V
* @param[out] tmpV2 : matrix temporary V
* @param[out] tmpInU : Tensor temporary in U
* @param[out] tmpInV : Tensor temporary in V
* @param[out] tmpOutU : Tensor temporary out U
* @param[out] tmpOutV : Tensor temporary out V
* @param nbRow : number of rows of the matrices to be created
* @param nbCol : number of columns of the matrices to be created
*/
void allocate_temporary(float *& tmpU1, float *& tmpU2, float *& tmpV1, float *& tmpV2,
PTensor<float> & tmpInU, PTensor<float> & tmpInV, PTensor<float> & tmpOutU, PTensor<float> & tmpOutV,
size_t nbRow, size_t nbCol)
{
|
Nous devons redimensionner nos tenseurs avant de les utiliser :
1
2
3
4
|
tmpInU.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpInV.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpOutU.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpOutV.resize(AllocMode::ALIGNED, nbRow, nbCol);
|
Puis, nous initialisons leurs valeurs par défault (1 pour
U et 0 pour
V) :
1
2
3
4
|
tmpInU.fill(1.0f);
tmpOutU.fill(1.0f);
tmpInV.fill(0.0f);
tmpOutV.fill(0.0f);
|
Maintenant nous pouvons injecter du
V et retirer du
U au centre de nos images. POur cela nous définissons quelques variable de contrôl qui nous permettrons de jouer sur la taille du rectangle de départ :
1
2
3
4
5
6
7
|
size_t frac(16lu), numBegin(7lu), numEnd(8lu), rowShift(-4lu);
for(size_t i(rowShift + (numBegin*nbRow)/frac); i < rowShift + (numEnd*nbRow)/frac; ++i){
for(size_t j((numBegin*nbCol)/frac); j < (numEnd*nbCol)/frac; ++j){
tmpInU.setValue(i, j, 0.0f);
tmpInV.setValue(i, j, 1.0f);
}
}
|
Cela nous donne une image
V initiale qui ressemble à la figure
1. Vous pouvez, bien sur, modifier cette fonction pour initialiser votre matrice
V comme bon vous semble.
Il faut maintenant initialiser les pointeurs que nous avons passé par référence afin que l'on puisse les modifier à l'exérieur de la fonction :
1
2
3
4
5
|
tmpU1 = tmpInU.getData();
tmpU2 = tmpOutU.getData();
tmpV1 = tmpInV.getData();
tmpV2 = tmpOutV.getData();
|
Finalement, nous fermons cette implémentation de fonction :
Le fichier
temporary_alloc.cpp complet :
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
|
#include "temporary_alloc.h"
///Allocate temporary
/** @param[out] tmpU1 : matrix temporary U
* @param[out] tmpU2 : matrix temporary U
* @param[out] tmpV1 : matrix temporary V
* @param[out] tmpV2 : matrix temporary V
* @param[out] tmpInU : Tensor temporary in U
* @param[out] tmpInV : Tensor temporary in V
* @param[out] tmpOutU : Tensor temporary out U
* @param[out] tmpOutV : Tensor temporary out V
* @param nbRow : number of rows of the matrices to be created
* @param nbCol : number of columns of the matrices to be created
*/
void allocate_temporary(float *& tmpU1, float *& tmpU2, float *& tmpV1, float *& tmpV2,
PTensor<float> & tmpInU, PTensor<float> & tmpInV, PTensor<float> & tmpOutU, PTensor<float> & tmpOutV,
size_t nbRow, size_t nbCol)
{
tmpInU.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpInV.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpOutU.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpOutV.resize(AllocMode::ALIGNED, nbRow, nbCol);
tmpInU.fill(1.0f);
tmpOutU.fill(1.0f);
tmpInV.fill(0.0f);
tmpOutV.fill(0.0f);
size_t frac(16lu), numBegin(7lu), numEnd(8lu), rowShift(-4lu);
for(size_t i(rowShift + (numBegin*nbRow)/frac); i < rowShift + (numEnd*nbRow)/frac; ++i){
for(size_t j((numBegin*nbCol)/frac); j < (numEnd*nbCol)/frac; ++j){
tmpInU.setValue(i, j, 0.0f);
tmpInV.setValue(i, j, 1.0f);
}
}
tmpU1 = tmpInU.getData();
tmpU2 = tmpOutU.getData();
tmpV1 = tmpInV.getData();
tmpV2 = tmpOutV.getData();
}
|
Vous pouvez le télécharger
ici.