Приведенный ниже код создан с помощью ChatGPT, где я опускаю процедуру, выполняя нетривиальную задачу — просто извлечение элементов. :
Код: Выделить всё
#include "pch.h"
#include "WolframLibrary.h"
#include // For std::memcpy
#include // For std::rand() and std::srand()
#include // For std::time()
// Initialization function
EXTERN_C DLLEXPORT int WolframLibrary_initialize(WolframLibraryData libData) {
// Seed the random number generator with current time
std::srand(static_cast(std::time(nullptr)));
return LIBRARY_NO_ERROR;
}
// Uninitialization function
EXTERN_C DLLEXPORT void WolframLibrary_uninitialize(WolframLibraryData libData) {}
// The main function implementing TestCode
EXTERN_C DLLEXPORT int TestCode(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
// Extract inputs
MTensor dataTensor = MArgument_getMTensor(Args[0]);
mint Nsampled = MArgument_getInteger(Args[1]);
// Get dimensions
mint* dims = libData->MTensor_getDimensions(dataTensor);
mint len = dims[0];
mint dim2 = dims[1];
// Access the data
double* data = libData->MTensor_getRealData(dataTensor);
// Prepare output (copy of data)
MTensor datanew1Tensor;
mint outDims[2] = {len, dim2};
libData->MTensor_new(MType_Real, 2, outDims, &datanew1Tensor);
double* datanew1 = libData->MTensor_getRealData(datanew1Tensor);
std::memcpy(datanew1, data, sizeof(double) * len * dim2); // Use std::memcpy
// Variables
int n1, n2;
double type1, type2, e1, e2;
int indextype = 1; // or pass as an argument
int indexE = 2; // or pass as an argument
for (mint i = 0; i < Nsampled; ++i) {
// Random index generation (1-based indexing)
n1 = 1 + (std::rand() % len);
do {
n2 = 1 + (std::rand() % len);
} while (n2 == n1);
// Extract types and energies
double val1 = datanew1[(n1 - 1) * dim2 + (indextype - 1)];
double val2 = datanew1[(n2 - 1) * dim2 + (indextype - 1)];
type1 = (2 * (std::rand() % 2) - 1.0) * ((n1
Подробнее здесь: [url]https://stackoverflow.com/questions/79079380/the-fastest-way-of-extracting-table-elements-in-c[/url]
Мобильная версия