我正在使用NE10 library进行一些矢量计算。该库有一个复数的类型,它是这样的结构:
typedef struct
{
ne10_float32_t r;
ne10_float32_t i;
} ne10_fft_cpx_float32_t;
我想要一个函数,它将这些结构的数组(复数的一维数组)作为参数,并仅对数组的r或i元素执行向量计算。这是一个获得想法的功能的例子:
void multiple_real_part_by_two(ne10_fft_cpx_float32_t* output,
ne10_fft_cpx_float32_t* input, ne10_uint32_t array_length)
{
ne10_mulc_float_c (&output->r, &input->r, 2.0, array_length)
}
所以我希望输出数组类似于输入数组,但每个r元素应该乘以2。问题是,上面写的函数的方式不起作用,并导致分段错误。我认为问题在于我如何尝试将r元素的数组传递给ne10_mulc_float_c()
函数。
ne10_mulc_float_c()
函数作为参数指向两个大小为ne10_float32_t
的{{1}}类型的数组。输入数组的元素乘以作为第三个参数传递的数字,结果存储在输出数组中。可以找到文档here.
我有办法做到这一点吗?我知道我可以在for循环中执行此操作
array_length
但我不想这样做,因为性能至关重要,这就是为什么我首先尝试使用NE10提供的矢量操作。
答案 0 :(得分:0)
问题是您提供了正确类型的library(RODBC)
database <- "C:\\Path\\To\\Database\\File.accdb"
conn <- odbcDriverConnect(paste0('Driver={Microsoft Access Driver (*.mdb, *.accdb)};
DBQ=', database))
lapply(c("table4", "table7", "table8", "table9", "table10", "table11"),
function(t) sqlQuery(conn, paste0("DELETE FROM ", t)))
close(conn)
个参数,但这些参数与假设不匹配。
根据library's documentation page,该函数定义为:
ne10_mulc_float_c()
使用以下参数:
ne10_result_t ne10_mulc_float_c (ne10_float32_t *dst, ne10_float32_t *src,
const ne10_float32_t cst, ne10_uint32_t count)
这意味着该函数假定dst和src是指向[out] dst Pointer to the destination array
[in] src Pointer to the source array
[in] cst The constant to multiply by
[in] count The number of scalar values to be processed
CONSECUTIVE浮点数数组的指针。
不幸的是,您传递的参数不是这种情况:
count
和&output->r
都是指向一个浮点数的指针。所以很快在这个函数试图访问它期望的数组中的第二个项目时,它的代码超出了数组的实际界限,这就是UB。这就是为什么它不起作用,你得到分段错误。
你的for循环很好。别忘了:
Premature optimization is the root of all evil。
- Donald Knuth