本文整理汇总了C++中WolframLibraryData::MTensor_getType方法的典型用法代码示例。如果您正苦于以下问题:C++ WolframLibraryData::MTensor_getType方法的具体用法?C++ WolframLibraryData::MTensor_getType怎么用?C++ WolframLibraryData::MTensor_getType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类WolframLibraryData
的用法示例。
在下文中一共展示了WolframLibraryData::MTensor_getType方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: demo_T_T
/**
* Constructs a copy of the input tensor with the number of elements,
* rank, and type appended at the end.
**/
DLLEXPORT int demo_T_T(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
MTensor T_arg, T_res;
mint i, rank, type, num, len;
mint const* dims;
mint* intData;
mint* intDataNew;
mreal* realData;
mreal* realDataNew;
int err = LIBRARY_NO_ERROR;
T_arg = MArgument_getMTensor(Args[0]);
rank = libData->MTensor_getRank(T_arg);
type = libData->MTensor_getType(T_arg);
dims = libData->MTensor_getDimensions(T_arg);
num = libData->MTensor_getFlattenedLength(T_arg);
/*
The result is going to have all the elements, also
the length of each dimension, number of elems, rank and type.
*/
len = num + rank + 3;
err = libData->MTensor_new(type, 1, &len, &T_res);
if (err) return err;
if ( type == MType_Integer) {
intData = libData->MTensor_getIntegerData(T_arg);
intDataNew = libData->MTensor_getIntegerData(T_res);
for ( i = 0; i < num; i++) {
intDataNew[i] = intData[i];
}
for ( i = 0; i < rank; i++) {
intDataNew[i+num] = dims[i];
}
intDataNew[num+rank] = num;
intDataNew[num+rank+1] = rank;
intDataNew[num+rank+2] = type;
}
else if ( type == MType_Real) {
realData = libData->MTensor_getRealData(T_arg);
realDataNew = libData->MTensor_getRealData(T_res);
for ( i = 0; i < num; i++) {
realDataNew[i] = realData[i];
}
for ( i = 0; i < rank; i++) {
realDataNew[i+num] = dims[i];
}
realDataNew[num+rank] = num;
realDataNew[num+rank+1] = rank;
realDataNew[num+rank+2] = type;
}
MArgument_setMTensor(Res, T_res);
return LIBRARY_NO_ERROR;
}
示例2: brusselator_pde_jacobian_values
DLLEXPORT int brusselator_pde_jacobian_values(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
int err;
mint i, j, k, n, nr;
mreal dm;
mreal *u, *v, *jval;
MTensor Tres, Targ;
Targ = MArgument_getMTensor(Args[1]);
if (libData->MTensor_getType(Targ) != MType_Real) return LIBRARY_TYPE_ERROR;
if (libData->MTensor_getRank(Targ) != 1) return LIBRARY_RANK_ERROR;
nr = libData->MTensor_getFlattenedLength(Targ);
n = nr/2;
u = libData->MTensor_getRealData(Targ);
v = u + n;
nr = 4 + 8*(n - 2);
err = libData->MTensor_new(MType_Real, 1, &nr, &Tres);
if (err) return err;
jval = libData->MTensor_getRealData(Tres);
/* Decrement n so loop excludes boundaries */
n--;
dm = (mreal) n;
dm *= alpha*dm;
k = 0;
jval[k++] = -1.; /* u[0] bc */
for (i = 1; i < n; i++) {
/* u equations */
jval[k++] = dm;
jval[k++] = 2.*u[i]*v[i] - 4. - 2.*dm;
jval[k++] = dm;
jval[k++] = u[i]*u[i];
}
jval[k++] = -1.; /* u[n] bc */
jval[k++] = -1.; /* v[0] bc */
for (i = 1; i < n; i++) {
/* v equations */
jval[k++] = 3. - 2.*u[i]*v[i];
jval[k++] = dm;
jval[k++] = -u[i]*u[i] - 2.*dm;
jval[k++] = dm;
}
jval[k++] = -1.; /* v[n] bc */
MArgument_setMTensor(Res, Tres);
return 0;
}
示例3: brusselator_pde_jacobian_positions
DLLEXPORT int brusselator_pde_jacobian_positions(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
int err;
mint dims[2];
mint i, j, k, n, nr;
mint *jpos;
MTensor Tres, Targ;
Targ = MArgument_getMTensor(Args[1]);
if (libData->MTensor_getType(Targ) != MType_Real) return LIBRARY_TYPE_ERROR;
if (libData->MTensor_getRank(Targ) != 1) return LIBRARY_RANK_ERROR;
nr = libData->MTensor_getFlattenedLength(Targ);
n = nr/2;
dims[0] = 4 + 8*(n - 2);
dims[1] = 2;
err = libData->MTensor_new(MType_Integer, 2, dims, &Tres);
if (err) return err;
jpos = libData->MTensor_getIntegerData(Tres);
/* Decrement n so loop excludes boundaries */
n--;
k = 0;
jpos[k++] = 1; jpos[k++] = 1; /* u[0] bc */
for (i = 1; i < n; i++) {
/* u equations */
mint r = i + 1;
jpos[k++] = r; jpos[k++] = i;
jpos[k++] = r; jpos[k++] = i + 1;
jpos[k++] = r; jpos[k++] = i + 2;
jpos[k++] = r; jpos[k++] = i + n + 2;
}
jpos[k++] = n + 1; jpos[k++] = n + 1; /* u[n] bc */
jpos[k++] = n + 2; jpos[k++] = n + 2; /* v[0] bc */
for (i = 1; i < n; i++) {
/* v equations */
mint r = i + n + 2;
jpos[k++] = r; jpos[k++] = i + 1;
jpos[k++] = r; jpos[k++] = i + n + 1;
jpos[k++] = r; jpos[k++] = i + n + 2;
jpos[k++] = r; jpos[k++] = i + n + 3;
}
jpos[k++] = 2*(n + 1); jpos[k++] = 2*(n + 1); /* v[n] bc */
MArgument_setMTensor(Res, Tres);
return 0;
}
示例4: brusselator_pde_rhs
DLLEXPORT int brusselator_pde_rhs(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
int err;
mint i, j, n, nr;
mreal dm, uuv;
mreal *u, *v, *up, *vp;
MTensor Tres, Targ;
Targ = MArgument_getMTensor(Args[1]);
if (libData->MTensor_getType(Targ) != MType_Real) return LIBRARY_TYPE_ERROR;
if (libData->MTensor_getRank(Targ) != 1) return LIBRARY_RANK_ERROR;
nr = libData->MTensor_getFlattenedLength(Targ);
n = nr/2;
u = libData->MTensor_getRealData(Targ);
v = u + n;
err = libData->MTensor_new(MType_Real, 1, &nr, &Tres);
if (err) return err;
up = libData->MTensor_getRealData(Tres);
vp = up + n;
/* Decrement n so loop excludes boundaries */
n--;
dm = (mreal) n;
dm *= alpha*dm;
/* Boundary conditions to converge to correct values */
up[0] = 1. - u[0];
up[n] = 1. - u[n];
vp[0] = 3. - v[0];
vp[n] = 3. - v[n];
for (i = 1; i < n; i++) {
mreal uuv = u[i];
uuv *= uuv*v[i];
up[i] = 1. + uuv - 4.*u[i] + dm*(u[i - 1] - 2.*u[i] + u[i + 1]);
vp[i] = 3.*u[i] - uuv + dm*(v[i - 1] - 2.*v[i] + v[i + 1]);
}
MArgument_setMTensor(Res, Tres);
return 0;
}
示例5: refine
DLLEXPORT int refine(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
int err;
mint i, j, k, m, n, nr;
mint const * dims;
mint rdims[2];
mreal dist, distsq;
mreal x1, x2, dx, y1, y2, dy, d, s, ds;
mreal *x, *y, *rx, *ry;
MTensor Targ, Tres;
dist = MArgument_getReal(Args[0]);
distsq = dist*dist*(1. + 1.e-8); /* Avoid adding extra points due to roundoff */
Targ = MArgument_getMTensor(Args[1]);
if (libData->MTensor_getType(Targ) != MType_Real) return LIBRARY_TYPE_ERROR;
if (libData->MTensor_getRank(Targ) != 2) return LIBRARY_RANK_ERROR;
dims = (libData->MTensor_getDimensions)(Targ);
if (dims[0] != 2) return LIBRARY_DIMENSION_ERROR;
n = dims[1];
x = libData->MTensor_getRealData(Targ);
y = x + n;
/* Do a pass to determine the length of the result */
x2 = x[0];
y2 = y[0];
nr = n;
for (i = 1; i < n; i++) {
x1 = x2;
y1 = y2;
x2 = x[i];
y2 = y[i];
dx = x2 - x1;
dy = y2 - y1;
d = dx*dx + dy*dy;
if (d > distsq) {
d = sqrt(d);
k = ((mint) ceil(d/dist)) - 1;
nr += k;
}
}
rdims[0] = 2;
rdims[1] = nr;
err = libData->MTensor_new(MType_Real, 2, rdims, &Tres);
if (err) return err;
rx = libData->MTensor_getRealData(Tres);
ry = rx + nr;
x2 = x[0];
y2 = y[0];
rx[0] = x2;
ry[0] = y2;
for (j = i = 1; i < n; i++, j++) {
x1 = x2;
y1 = y2;
x2 = x[i];
y2 = y[i];
dx = x2 - x1;
dy = y2 - y1;
d = dx*dx + dy*dy;
if (d > distsq) {
d = sqrt(d);
k = ((mint) ceil(d/dist)) - 1;
ds = 1./((mreal) (k + 1));
for (m = 1; m <= k; m++, j++) {
s = m*ds;
rx[j] = x1 + s*dx;
ry[j] = y1 + s*dy;
}
}
rx[j] = x2;
ry[j] = y2;
}
MArgument_setMTensor(Res, Tres);
return 0;
}