📄 indirect.cpp
字号:
#include <blitz/array.h>
#include <blitz/array/indirect.h>
#include <list>
#include <vector>
BZ_USING_NAMESPACE(blitz)
BZ_USING_NAMESPACE(std)
void example1()
{
// Indirection using a list of TinyVector<int,N> objects
Array<int,2> A(4,4), B(4,4);
A = 0;
B = 10*tensor::i + tensor::j;
typedef TinyVector<int,2> coord;
list<coord> I;
I.push_back(coord(1,1));
I.push_back(coord(2,2));
A[I] = B;
cout << "B = " << B << endl << "A = " << A << endl;
// B = 4 x 4
// 0 1 2 3
// 10 11 12 13
// 20 21 22 23
// 30 31 32 33
// A = 4 x 4
// 0 0 0 0
// 0 11 0 0
// 0 0 22 0
// 0 0 0 0
}
void example2()
{
// Cartesian-product indirection
Array<int,2> A(6,6), B(6,6);
A = 0;
B = 10*tensor::i + tensor::j;
vector<int> I, J;
I.push_back(1);
I.push_back(2);
I.push_back(4);
J.push_back(2);
J.push_back(0);
J.push_back(5);
A[indexSet(I,J)] = B;
cout << "B = " << B << endl << "A = " << A << endl;
// B = 6 x 6
// 0 1 2 3 4 5
// 10 11 12 13 14 15
// 20 21 22 23 24 25
// 30 31 32 33 34 35
// 40 41 42 43 44 45
// 50 51 52 53 54 55
// A = 6 x 6
// 0 0 0 0 0 0
// 10 0 12 0 0 15
// 20 0 22 0 0 25
// 0 0 0 0 0 0
// 40 0 42 0 0 45
// 0 0 0 0 0 0
}
void example3()
{
// Simple 1-D indirection, using a STL container of int
Array<int,1> A(5), B(5);
A = 0;
B = 1, 2, 3, 4, 5;
vector<int> I;
I.push_back(2);
I.push_back(4);
I.push_back(1);
A[I] = B;
cout << "B = " << B << endl << "A = " << A << endl;
// B = [ 1 2 3 4 5 ]
// A = [ 0 2 3 0 5 ]
}
void example4()
{
// Indirection using a list of RectDomain<N> objects.
const int N = 7;
Array<int,2> A(N,N), B(N,N);
typedef TinyVector<int,2> coord;
A = 0;
B = 1;
double centre_i = (N-1)/2.0;
double centre_j = (N-1)/2.0;
double radius = 0.8 * N/2.0;
// circle will contain a list of strips which represent a circular
// subdomain.
list<RectDomain<2> > circle;
for (int i=0; i < N; ++i)
{
double jdist2 = pow2(radius) - pow2(i-centre_i);
if (jdist2 < 0.0)
continue;
int jdist = int(sqrt(jdist2));
coord startPos(i, int(centre_j - jdist));
circle.push_back(strip(startPos, secondDim, int(centre_j + jdist)));
}
// Set only those points in the circle subdomain to 1
A[circle] = B;
cout << "A = " << A << endl;
// A = 7 x 7
// 0 0 0 0 0 0 0
// 0 0 1 1 1 0 0
// 0 1 1 1 1 1 0
// 0 1 1 1 1 1 0
// 0 1 1 1 1 1 0
// 0 0 1 1 1 0 0
// 0 0 0 0 0 0 0
}
int main()
{
example1();
example2();
example3();
example4();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -