我正在尝试编写一个使用libhdf5的matlab mex函数; 我的Linux安装提供了libhdf5-1.8共享库和头文件.但是,我的Matlab版本r2007b提供了1.6版本的libhdf5.so.(matlab .mat文件bootstrap hdf5,显然).当我编译mex时,它在Matlab中会出现段错误.如果我将我的libhdf5版本降级到1.6(不是长期选项),代码编译并运行正常.
问题:我该如何解决这个问题?如何告诉mex编译过程链接/usr/lib64/libhdf5.so.6而不是/opt/matlab/bin/glnxa64/libhdf5.so.0?当我尝试-Wl,-rpath-link,/usr/lib64在我的编译中使用时,我得到的错误如下:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
mex: link of 'hdf5_read_strings.mexa64' failed.
make: *** [hdf5_read_strings.mexa64] Error 1
Run Code Online (Sandbox Code Playgroud)
ACK.最后一种方法是下载hdf5-1.6.5标题的本地副本并完成它,但这不是未来的证明(Matlab版本升级是我的未来.).有任何想法吗?
编辑:根据Ramashalanka的优秀建议,我
A)要求mex -v获得3个gcc命令; 最后一个是链接器命令;
B)用a -v来调用该链接器命令来获取collect命令;
C)调用它collect2 -v -t和其余的标志.
我输出的相关部分:
/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so) …Run Code Online (Sandbox Code Playgroud) 假设我想编写一个函数,R其中包含一些关于某些数据的足够统计数据的函数.例如,假设函数,调用它foo.func仅取决于数据样本的样本均值.为方便起见,我认为用户可能希望传递 foo.func随机变量的样本(在这种情况下foo.func计算样本均值), 或样本均值本身,这就是所foo.func需要的.出于效率的原因,如果存在诸如foo.func被调用的多个函数,则可以采用样本均值,后者是优选的.在这种情况下,平均值只需要计算一次(在我遇到的实际问题中,所讨论的样本统计数据可能是计算密集型的).
总之,我想写入foo.func初学者可访问(传入数据,让函数计算足够的统计数据)以及专家(预先计算足够的效率统计数据并将其传递).推荐的做法是什么?我是否传递了逻辑标志?多个参数?一些方法可能是:
#optional arguments
foo.func <- function(xdata, suff.stats=NULL) {
if (is.null(suff.stats)) {
suff.stats <- compute.suff.stats(x)
}
#now operate on suff.stats
}
Run Code Online (Sandbox Code Playgroud)
要么
#flag input
foo.func <- function(data.or.stat, gave.data=TRUE) {
if (gave.data) {
data.or.stat <- compute.suff.stats(data.or.stat)
}
#now operate on data.or.stat
}
Run Code Online (Sandbox Code Playgroud)
我想,我倾向于前者
我正在考虑从Matlab转到Python/numpy进行数据分析和数值模拟.我已经使用Matlab(和SML-NJ)多年了,并且在功能环境中非常舒适而没有副作用(除了I/O),但我对Python中的副作用有点不情愿.人们可以分享他们最喜欢的关于副作用的问题,如果可能的话,他们如何绕过它们?作为一个例子,当我在Python中尝试以下代码时,我有点惊讶:
lofls = [[]] * 4 #an accident waiting to happen!
lofls[0].append(7) #not what I was expecting...
print lofls #gives [[7], [7], [7], [7]]
#instead, I should have done this (I think)
lofls = [[] for x in range(4)]
lofls[0].append(7) #only appends to the first list
print lofls #gives [[7], [], [], []]
Run Code Online (Sandbox Code Playgroud)
提前致谢
我有点困惑为什么sdR中的函数返回一个矩阵输入的数组(我想保持向后兼容性,它总是会).这对我来说是非常奇怪的行为:
#3d input, same same
print(length(mean(array(rnorm(60),dim=c(3,4,5)))))
print(length(sd(array(rnorm(60),dim=c(3,4,5)))))
#1d input, same same
print(length(mean(array(rnorm(60),dim=c(60)))))
print(length(sd(array(rnorm(60),dim=c(60)))))
#2d input, different!
print(length(mean(array(rnorm(60),dim=c(12,5)))))
print(length(sd(array(rnorm(60),dim=c(12,5)))))
Run Code Online (Sandbox Code Playgroud)
我明白了
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 5
Run Code Online (Sandbox Code Playgroud)
这与输入是2-d数组时的sd行为不同mean(显然仅在这种情况下!)然后考虑,这个失败的函数通过标准偏差重新缩放k维数组的每一列:
re.scale <- function(x) {
#rescale by the standard deviation of each column
scales <- apply(x,2,sd)
ret.val <- sweep(x,2,scales,"/")
}
#this works just fine
x <- array(rnorm(60),dim=c(12,5))
y <- re.scale(x)
#this throws a warning
x <- array(rnorm(60),dim=c(3,4,5))
y <- re.scale(x)
Run Code Online (Sandbox Code Playgroud)
sd如果没有这种奇怪的行为,还有其他一些功能需要替换吗?如何re.scale …
通常,如果我在文件中包含foo.m以下形式的注释:
% See also: <a href="http://en.wikipedia.org/etc">link name</a>
Run Code Online (Sandbox Code Playgroud)
该链接出现在帮助浏览器中,即在Matlab中,我发布
>> help foo
Run Code Online (Sandbox Code Playgroud)
我得到类似的东西
另请参见:链接名称
到现在为止还挺好.但是,有一些网址有搞笑人物,例如:
% See also: <a href="http://en.wikipedia.org/wiki/Kernel_(statistics)">http://en.wikipedia.org/wiki/Kernel_(statistics)</a>
Run Code Online (Sandbox Code Playgroud)
Matlab无法在帮助浏览器中正确呈现此内容.当我查看帮助时,它看起来像这样:
链接到名为'statistics'的本地目录.我尝试了各种引用转义和反斜杠,但无法让浏览器正常工作.
我正在尝试用 R 编写我自己的建模函数,它需要一个公式、一些数据以及一些额外的上下文,比如权重;在调用model.frame以提取必要的数字数据后,它将执行拟合。我的第一遍看起来像:
my_modfunc <- function(formula,data,weights=NULL) {
mf <- model.frame(formula,data=data,weights=weights)
wt <- model.weights(mf)
# do some fitting here...
}
# make fake data to test it
set.seed(1234)
data <- data.frame(x1=rnorm(50),x2=rnorm(50),y=rnorm(50),w=runif(50))
# call it:
my_modfunc(y ~ x1 + x2,data=data,weights=w)
Run Code Online (Sandbox Code Playgroud)
这失败了,我收到错误:
Error in model.frame.default(formula, data = data, weights = weights) :
invalid type (closure) for variable '(weights)'
同样,如果我打电话
my_modfunc(y ~ x1 + x2,data=data,weights='w')
Run Code Online (Sandbox Code Playgroud)
我犯了同样的错误。我怀疑环境、引用等有问题。
剪切和粘贴 的源代码lm,我可以将我的函数重写为
# based on lm
weird_modfunc <- function(formula,data,weights=NULL ) {
cl …Run Code Online (Sandbox Code Playgroud)