贡献者: addis
北太天元是国产的 Matlab 替代品。目前还不是很完善,bug 较多。北大内部下载链接。开发者预览下载。笔者的插件代码见 GitHub。
baltam::extern_obj_base
继承
struct extern_obj_base {
virtual extern_obj_base* dup() const { return nullptr; }
virtual ~extern_obj_base() {};
virtual std::string to_string() const { return ""; }
virtual std::string classname() const { return "extern object"; };
int sid; ///< 整数,用于存储内核自动分配的外部类 ID
};
#define PLUGIN_NAME "vector"
定义插件名称
bxArray
相当于 Matlab api 的 mxArray,基本上就是 Matlab 的矩阵,什么都能装。
BV_USE_DYN_LOADER
static bexfun_info_t flist[] = {
{"我的命名空间::函数名1", 函数名1, 函数名1的帮助说明字符串},
{"我的命名空间::函数名2", 函数名2, 函数名2的帮助说明字符串},
...
{"", NULL, NULL} // 表示结尾
};
// 告诉 baltam 插件包含的函数
// 如果使用了命名空间, 在 Baltam 中调用函数同样需要 命名空间::函数名
来调用
bexfun_info_t *bxPluginFunctions() { return flist; }
// [可选] plugin 初始化, 输入 libbex 的句柄, 正常结束返回 0
// int bxPluginInitLib(void *hdl) {...}
// 自定义 class, 必须继承于 extern_obj_base
...
struct bVector : public extern_obj_base {
BALTAM_LOCAL static int ID; // 定义插件的 ID (会被内核使用)
std::vector<bxArray*> data;
// 复制这个对象(duplicate) 用于 baltam 中的 B = A
extern_obj_base *dup() const override;
~bVector() override;
// 可选:打印对象信息
std::string to_string() const override;
// 可选:自定义类型名字
std::string classname() const override;
};
// 声明自定义类型
int bxPluginInit(int, const bxArray*[]) {
bxAddCXXClass<自定义类型>(PLUGIN_NAME, bex::__bxAddCXXClass_impl);
return 0;
}
int bVector::ID = 0;
// bex 就相当于 matlab 的 mex 哈哈哈
extern_obj_base *bVector::dup() const {
bVector *ret = new bVector(*this);
for (size_t i = 0; i < this->data.size(); ++i)
ret->data[i] = bex::__bxDuplicateArray(data[i]);
return ret;
}
// 把 vector<> 中的每个 bxArray 毁灭
bVector::~bVector(){
for (auto &i : data)
bex::__bxDestroyArray(i);
}
// 自定义插件函数的 prototype 为 (nlhs 是输出个数, nrhs 是输入个数)。
// 当 nlhs 为零时, 输出 plhs[0] 可以传给 ans 变量
void 函数名(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs
[]);
// 显示 bVector 信息
// bxGetExtObj() 把 bxArray 转换为外部对象
void bv_show(int, bxArray *[], int nrhs, const bxArray *prhs[]){
bVector *bv = bxGetExtObj<bVector>(prhs[0], bex::__bxGetExtObj_impl);
// 这里用 cout 并不妥, 应该用 bxPrintf, 见文档
for (size_t i = 0; i < bv->data.size(); ++i){
std::cout << '[' << i << "] "
<< bex::__bxTypeCStr(bv->data[i]) << std::endl;
}
}
Baltam/plugin/插件名/
,插件的 so 文件必须是 main.so
int bxPrintf(const char * format, ...);
用法和 printf
一样
void bxErrMsgTxt(const char * str);
终止当前函数调用并向图形界面或命令行窗口输出错误信息
baInt bxAsInt(const bxArray *ba, int * err);
尝试将给定 bxArray 对象转化为内置整数
int bxAsCStr(const bxArray *ba, char *buff, baSize size);
尝试将给定 bxArray 对象转化为 char
类型字符串
// 用于实现重载 + 的声明, 函数名称任意
void my_add(int, bxArray*[], int, const bxArray*[]);
int bxPluginInit(int, const bxArray*[]) {
bxAddCXXClass<自定义类型1>(PLUGIN_NAME);
// 向内核注册重载的算符, ID 可以是自定义对象, 也可以是内建对象的
bxRegisterBinaryOperator(PLUGIN_NAME, "+", 自定义类型1::ID,
自定义类型2::ID, my_add);
return 0;
}