我在C中编写了一个小程序来管理SQLite3中的参考书目数据库.到目前为止,这只是一个允许导入和导出BibTeX数据的命令行工具.为了使导出/导入功能更具可定制性(例如,总是在导入时将日期和月份字段组合在一起,或者在导出时跳过某些字段),这些函数用Lua编写并从C调用. 现在我希望Lua成为可选的依赖项.有什么好办法呢?即如果在编译时没有找到Lua,则回退到更基本的导入/导出功能.
现在,例如在导出时,我从SQL(sqlite3_exec)获取数据并将其直接写入回调函数中的Lua表,就像这样(stripped stackoverflow-handling ;-)):
int db_meta_cb(void *udata, int n, char **cval, char **ckey) {
while (n-- > 0) {
lua_pushstring(L, cval[n]);
lua_setfield(L, -2, ckey[n]);
};
};
Run Code Online (Sandbox Code Playgroud)
然后有一个Lua函数,它将这样一个表作为参数并漂亮地打印一个BibTeX条目.类似的导入故事:BibTeX解析器(Lex/YACC生成的C代码)编写Lua表并调用'cleanup'Lua函数,然后从同一个Lua表读取结果并将其插入数据库.
现在这在我使用Lua太多的意义上感觉不对,我猜因为数据包含(键,值) - pairs.
请注意,这个项目的一个原因是试验/了解在C中嵌入Lua,所以请不要建议(a)使用一个可用的参考书目管理器,或者(b)完全重写Python或Lua中的所有内容...... (我已经完成了btw)
我用C语言编写了一个用于Lua的userdata类型.它有一些数组类型属性和各种方法.现在,如果你是这种类型,我使用u:set(k,v)resp.u:get(k)访问数据和例如u:sort()作为方法.为此,我设置__index了一个包含这些方法的表.现在,如果我想用访问数据u[k] = v或者u[k],我需要设置__newindex和__index对setRESP get.但是其他方法再也无法访问了......
在C中处理这个问题的最佳方法是什么?我猜我需要在C中编写一个函数来注册,__index并以某种方式在那里处理它.也许检查密钥是否属于Lua方法表,如果是,则调用它.
任何帮助/提示将不胜感激.我没有找到这样的例子,虽然这对我来说似乎是很自然的事情.
编辑: 在Lua中添加了我的C版解决方案,在下面的答案中发布.这或多或少都是直接翻译,所以所有功劳都归功于@ gilles-gregoire.
以下C函数注册为__index元方法.
static int permL_index(lua_State *L) {
struct perm **pp = luaL_checkudata(L, 1, PERM_MT);
int i;
luaL_getmetatable(L, PERM_MT);
lua_pushvalue(L, 2);
lua_rawget(L, -2);
if ( lua_isnil(L, -1) ) {
/* found no method, so get value from userdata. */
i = luaL_checkint(L, 2);
luaL_argcheck(L, 1 <= i && i <= (*pp)->n, 2, …Run Code Online (Sandbox Code Playgroud) 我正在寻找稀疏矩阵(scipy.sparse.csc_matrix)中包含非零元素的第一列.实际上,第一列以i-th 开头,包含非零元素.
这是某种线性方程求解器的一部分.对于密集矩阵,我有以下内容:(相关行pcol = ...)
import numpy
D = numpy.matrix([[1,0,0],[2,0,0],[3,0,1]])
i = 1
pcol = i + numpy.argmax(numpy.any(D[:,i:], axis=0))
if pcol != i:
# Pivot columns i, pcol
D[:,[i,pcol]] = D[:,[pcol,i]]
print(D)
# Result should be numpy.matrix([[1,0,0],[2,0,0],[3,1,0]])
Run Code Online (Sandbox Code Playgroud)
上面应该交换第1列和第2列.如果我们设置i = 0,D则保持不变,因为第0列已经包含非零条目.
为scipy.sparse矩阵执行此操作的有效方法是什么?是否有类似物的numpy.any()和numpy.argmax()功能?