虽然互联网上存在一些解决方案,但我发现这些解决方案都不适合我面临的问题(尽管我可能只是太愚蠢了):
我正在尝试构建一个R包,它广泛使用由Makefile编译的共享对象(是的,糟糕的做法,我知道,但是不能告诉Makevars文件将C和Fortran代码编译成一个共享对象)从包的src目录中的代码.无论我在哪里编译.so(我尝试过src,libs并且打包基本文件夹)或者我如何命名它(作为上面提到的解决方案之一,它必须像它包含的包一样命名),R CMD check退出
** testing if installed package can be loaded
Error in library.dynam(lib, package, package.lib) :
shared object ‘SoMNibEN.R.so’ not found
Run Code Online (Sandbox Code Playgroud)
由于useDynLib(SoMNibEN.R)我的NAMESPACE文件中的指令(SoMNibEN.R我的包名称在哪里,但它也不能与原始名称一起使用)
我的假设是我要么使用该useDynLib()命令错误,要么我的Makefile出错了(尽管编译工作得很好,共享对象是在我的项目文件夹中创建的 - 我只是不知道它是否被复制到包安装目录成功).
所以,如果有人知道我在这里做错了什么,请告诉我!
花了几天时间在互联网上搜索这样的东西后,我仍然找不到任何描述这个问题的东西.阅读(其他非常值得推荐的)'写R扩展'也不能提供解决方案.因此,这是我最迫切的问题:
是否可以传递函数(为简单起见,假设一个简单的R函数 - 实际上,问题甚至更加丑陋)作为Fortran通过.Fortran(...)调用的函数/子例程参数 - 如果是这样,如何?
为了测试这个,我编写了两个简单的函数,首先是一个Fortran子程序(为了使用我原本打算传递的函数而定制,因此界面中有点奇怪的维度):
subroutine foo(o, x)
implicit none
interface
subroutine o(t, y, param, f)
double precision, intent(in) :: t
double precision, dimension(58), intent(in) :: y, param
double precision, dimension(22), intent(out) :: f
end subroutine
end interface
double precision, dimension(22), intent(out) :: x
double precision, dimension(58) :: yt, paramt
integer :: i
do i = 1, 58
yt(i) = rand(0)
paramt(i) = rand(1)
end do
call o(dble(4.2), yt, paramt, x)
end subroutine
Run Code Online (Sandbox Code Playgroud)
和一个简单的R函数传递给上面的函数:
asdf <- function(a, s, …Run Code Online (Sandbox Code Playgroud) 我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。
我目前有一个 C 程序通过foo.c连接 Fortran 程序,大致如下代码所示:bar.f90dlopen/dlsym
foo.c:
#include <dlfcn.h>
#include <stdio.h>
int main()
{
int i, k = 4;
double arr[k];
char * e;
void * bar = dlopen("Code/Test/bar.so", RTLD_NOW | RTLD_LOCAL);
void (*allocArray)(int*);
*(void **)(&allocArray) = dlsym(bar, "__bar_MOD_allocarray");
void (*fillArray)(double*);
*(void **)(&fillArray) = dlsym(bar, "__bar_MOD_fillarray");
void (*printArray)(void);
*(void **)(&printArray) = dlsym(bar, "__bar_MOD_printarray");
double *a = (double*)dlsym(bar, "__bar_MOD_a");
for(i = 0; i < k; i++)
arr[i] = i * 3.14;
(*allocArray)(&k);
(*fillArray)(arr);
(*printArray)();
for(i = 0; …Run Code Online (Sandbox Code Playgroud) 我在两个物体上使用两个相同类型的 IMU(BHI160,即方向是相对于北方并与北方对齐,IMU 的局部 y 轴指向北方)在两个物体上,比如说笔,增加了难度如果我将两个物体平行放置,两个 IMU 的 z 轴都指向上方,但是一个 IMU 相对于另一个 IMU 围绕 z 轴旋转了 180°。
现在,如果我在这里正确理解数学,四元数数据I从IMU接收相对于正北方向半角旋转,以便q * north_dir * q_inv = IMU_y_axis(与north_dir和IMU_y_axis是用于起见在全局空间3D矢量,或纯的四元数这个计算)。
由于 IMU 的旋转,我假设当两支笔都指向同一方向时,我应该能够计算第二支笔的方向为q_2 = q_rot_z * q_1,其中q_rot_z等于围绕 z 轴旋转 90° - 遵循直觉如果我将两支笔都指向北方,我将通过计算获得笔 2 的 y 轴(即笔 1 的 y 轴绕 z 轴旋转 180°)的全局方向q_rot_z * north_dir * q_rot_z_inv
因此,如果我想知道笔尖的相对旋转(比如说,我需要从第一支笔的笔尖到第二支笔的笔尖的旋转),我需要计算q_r = q_2 * q_rot_z_inv * q_1_inv以便从笔尖获得,这是否正确1 到小费 2 通过计算q_r * q_1?或者在这种情况下围绕 z 轴的“先前”旋转是否无关紧要,我只需要q_r …
在QThread 类的文档中,一个示例设置的工作方式如下:
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
//some connects to thread and worker
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
Run Code Online (Sandbox Code Playgroud)
Qt 是否使用moveToThread(...)此处的函数实现了实际的移动语义?即线程是否会在完成后重新分配 Worker 对象,因为分配的对象永远不会Worker*在Controller()任何地方显式删除?
fortran ×2
r ×2
c ×1
c++ ×1
dlsym ×1
fortran2003 ×1
makefile ×1
math ×1
namespaces ×1
orientation ×1
package ×1
qt ×1
qthread ×1
quaternions ×1
sensors ×1