我正在objective-c
开展一个机器学习项目。哪个使用以下代码:
unsigned cStride = multiArray.strides[2].intValue;
unsigned hStride = multiArray.strides[3].intValue;
unsigned wStride = multiArray.strides[4].intValue;
for (unsigned h = 0; h < height; h++) {
for (unsigned w = 0; w < width; w++) {
unsigned highestClass = 0;
double highest = -DBL_MAX;
for (unsigned c = 0; c < channels; c++) {
unsigned offset = c * cStride + h * hStride + w * wStride;
double score = pointer[offset];
if (score > highest) {
highestClass = c;
highest = score;
}
}
// futher code
}
}
到目前为止一切顺利,它运作良好。但是我遇到了Accelerate
我要为这个类实现的,因为它可能比当前实现更快。
我决定实施vDSP_maxviD
。 https://developer.apple.com/documentation/accelerate/1449682-vdsp_maxvid?language=objc
他们的实现如下:
__单精度实数输入向量。
__我迈向A
__ C输出标量
__ IC输出标量指数
__ N要处理的元素数量
他们的引擎盖Accelerate
代码:
*C = -INFINITY;
for (n = 0; n < N; ++n)
{
if (*C < A[n * I])
{
*C = A[n * I];
*IC = n * I;
}
}
现在我开始考虑这种情况下的参数需要变成什么:
__A
将成为pointer
__C
将成为highest
__IC
将成为highestClass
__N
将成为channels
但是,我将__I
留空了。这是因为我不知道如何找到合适的pointer
地址。我之前使用的代码:
unsigned offset = c * cStride + h * hStride + w * wStride;
但是,我们现在错过c
,并在n
框架内被Accelerate
取代。
我的pointer
索引的正确计算是什么?
答案 0 :(得分:2)
pointer
作为vDSP_maxviD
忽略h
和w
依赖偏移量的第一个参数导致问题。
尝试:
double *channels_pointer = &pointer[h * hStride + w * wStride];
vDSP_maxviD(channels_pointer, cStride, &highest, &highestClass, channels);
答案 1 :(得分:0)
编辑:删除不必要的循环
我会尝试这样的事情(未经测试):
import { RequestHandler, ErrorRequestHandler } from 'express';
import * as Joi from 'joi';
interface IValidator {
validator: (data: string) => Joi.AnySchema
}
const thing: IValidator = {
validator: data => {
return Joi.string()
}
}
// this works
console.log(
thing.validator("javascript")
);
interface IMiddleware {
middleware: (RequestHandler|ErrorRequestHandler)[]
}
const thing2: IMiddleware = {
middleware: [
(res, req, next) => {
return next()
},
"foo" // this causes an error
]
}
答案 2 :(得分:0)
感谢 Grzegorz Owsiany ,最终的解决方案是:
double *channels_pointer = &pointer[h * hStride + w * wStride];
vDSP_maxviD(channels_pointer, cStride, &highest, &highestClass, channels);
但是,我还需要这样做:
highestClass /= cStride;