- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有谁知道 matlab mex 库的生命周期是什么?具体来说,我对以下内容感兴趣:
我在这里和网上进行了广泛的搜索,但找不到这些问题的答案。我的问题在初始化方面有一些性能成本,我想尽可能避免这种情况,而无需编写服务。
最佳答案
MEX 文件会保持加载状态,直到您清除它(clear myMexFun
或 clear mex
)或退出 MATLAB。
对于预加载,我所能建议的是在没有输入或 nop 等效输入的情况下调用函数。我在我的 mexFunction
中创建了简单的代码路径来无错误地处理此类调用,最简单的示例是 if(!nrhs) return;
。后续调用不需要从磁盘加载 mexFunction
(或 MEX 函数调用的共享库中的任何其他函数),之后您无需担心初始化成本。
关于初始化/清理、构造函数/析构函数等。我不知道有什么方法可以在加载或卸载 MEX 文件时查看 MATLAB 在做什么,但是 MEX 文件是常规共享文件仅导出单个函数 ( mexFunction
is the only entry point ) 的库(即 DLL/SO),因此,正如 Amro 指出的那样,您可以在 Windows 中实现 DllMain
来定义模块和线程附加/分离操作(请参阅 his answer 中的优秀示例)。我不知道与图书馆互动的任何其他机制。
要在模块卸载时执行任务,您可以使用 mexAtExit
在 mexFunction
中向 MATLAB 注册一个函数,以便在 MEX 函数卸载(再次清除或 MATLAB 退出)时调用。只需在全局命名空间中定义一个 static
函数,并使用 mexAtExit
注册它。 MATLAB (mexatexit.c) 提供的示例演示了关闭在 mexFunction
中打开但未关闭的文件流。您还可以释放持久内存、关闭流等。这是一个人为的示例:
mexDLLtext.cpp:
#include "mex.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
static FILE *fp=NULL;
static double *pDataC=NULL, *pDataCpp=NULL, *pMxData=NULL;
static char fName[L_tmpnam], counter = 0;
static void CleanUp(void)
{
fclose(fp); /* close file opened with fopen */
free(pDataC); /* deallocate buffer allocated with malloc/calloc */
delete[] pDataCpp; /* deallocate buffer allocated with new double[...] */
mxFree(pMxData); /* free data created with mx function like mxMalloc */
mexPrintf("Closing %s and freeing memory...\n",fName);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (!fp) { tmpnam(fName); fp = fopen(fName,"w"); }
fprintf(fp,"%d ",++counter);
if (!pDataC) pDataC = (double*) malloc(sizeof(double)*16);
if (!pDataCpp) pDataCpp = new double[16];
if (!pMxData) {
pMxData = (double*) mxMalloc(sizeof(double)*16);
mexMakeMemoryPersistent(pMxData); mexPrintf("First!\n");
}
mexAtExit(CleanUp);
// Then use the persistent data...
}
运行时:
>> mex -largeArrayDims mexDLLtest.cpp
>> for i=1:5, mexDLLtest; end
First!
>> clear mexDLLtest
Closing \s1rg.1 and freeing memory...
>> type E:\s1rg.1
1 2 3 4 5
并且您可以通过 mexLock
控制文件的卸载和 mexUnlock
.
当函数启动并返回到 MATLAB 时,参数(即 prhs
、plhs
)发生了什么是 very well documented ,另一方面,所以我想这不是您要问的。
关于多个实例,您可以尝试使用 Sysinternals' Process Explorer (如果使用 Window)查看哪些加载模块有线程在 MATLAB.exe 下运行。无论调用函数多少次或调用该函数的速度有多快,我都只在线程列表中看到一个(单线程)MEX 文件的一个实例。但是,一旦回到命令行,您可以执行 version -modules
来查看已加载模块的列表,正如 Amro 所建议的那样。 MEX 文件仍会存在,并且与 Process Explorer 可见的线程列表一样,我只看到 MEX 特定文件的一个实例。
谢谢 Amro 的意见。我很想看到这些问题的一些更权威的答案!
关于c++ - Matlab Mex 库生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575957/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!