Я недавно работал на методе конечных элементов с MATLABПередача функции ручки в качестве входных данных для Mex для Matlab
Я пытался оптимизировать свой код в MATLAB.
При поиске я обнаружил, что сборка матрицы может быть ускорена с помощью функции mex.
При переносе моей функции «PoissonAssembler.m» в mex я столкнулся с некоторыми проблемами.
PoissonAssembler.m имеет в основном такой вид конструкции.
for every element{
loc_stiff_assmbl();
loc_rhs_assmbl(); // this one involves with function evaluation @(x,y)
for every edges{
loc_edge_assmbl();
if boundary{
loc_rhs_edge_assmbl(); // this one also have function eval
}
}
}
В MATLAB, я
f = @(x,y) some_math_function;
Так как эта функция будет изменена для другого численного моделирования,
Я хотел использовать функцию ручки в качестве входных данных для MEX файла
I обнаружили, что есть способ сделать это, используя mexCallMatlab() и feval.
Однако, я думаю, что это замедлит мой код из-за накладных расходов, вызванных вызовом matlab.
Есть ли способ избежать этого без компиляции файла mex каждый раз, когда я меняю дескриптор функции?
Более точный код, как этот
for (k=0;k<nE;k++){ // nE : number of elements (about 10^5 to 10^6)
// other assembling procedure
blabla
// function evaluation for rhs assemble
for (i=0; i<nP; i++){ // nP : number of points in element
fxy[i] = f(x[i],y[i])};
}
// rhs assemble
for (j=0; j<nP; j++){
for (i=0; i<nP; i++){ // matrix vector multiplication
rhs[k*nE + j] += Mass[ i*nP + j]*fxy[i];
}
}
// face loop
for (f1 = 0; f1 < nF4E; f1++){ // number of face for each elements
switch(BCType[k1*nF4E + f1]){ // if boundary
case 1 : // Dirichlet
// inner product with evaluation of gD = @(x,y) function
CODE OMITTED
case 2 : // Neumann
// inner product with evaluation of gN = @(x,y) function
CODE OMITTED
}
}
}
Сколько возможных функций вам нужно передать? Один из вариантов - векторизация вашей функции, чтобы вы могли передавать все грани/элементы одновременно, а не вызывать ее в цикле. – Suever
Лучший сценарий здесь, вероятно, создает вашу mex-функцию с корпусом коммутатора для возможных функций .... Преимущество MATLAB в том, что оно очень гибкое, преимущество C в том, что он очень быстрый. Вы не можете иметь оба, Im fear –