我正在使用Eigen进行我正在进行的项目,其中运行时性能绝对至关重要(需要满足实时约束).
到目前为止,Eigen给了我相当不错的表现.但是,我需要评估一个Kronecker产品.我正在使用Eigen不支持的KroneckerProduct模块,但我认为它对我的需求来说并不是最理想的.
我正在计算Kronecker产品的两个矩阵具有固定大小(在编译时已知)和结构.一个矩阵是正方形和对角线,我们假设它是一个单位矩阵.另一个是一个小的方形矩阵.在代码中,像这样:
MatrixXf I = MatrixXf::Identity(4,4);
MatrixXf X = MatrixXf::Random(8,8);
MatrixXf P = kroneckerProduct(I,X);
Run Code Online (Sandbox Code Playgroud)
因为我是对角线的,所以我猜我们可以加快速度,因为我们只需要通过标量乘法来评估4个矩阵,以便计算所有元素(因为许多元素将为零).
使用Eigen的最快和最有效的方法是什么?
我刚刚在我的Debian机器上安装了OpenCV,我遇到了问题.我按照Wiki上的安装指南进行操作.尝试编译示例会给出看似成功的编译,但是尝试运行它们最终会抛出错误:
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$ g++ -Wall em.cpp
-lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_video
-lopencv_features2d -lopencv_ml -lopencv_highgui -lopencv_objdetect
-lopencv_contrib -lopencv_legacy
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$ ./a.out
./a.out: error while loading shared libraries: libopencv_core.so.2.3:
cannot open shared object file: No such file or directory
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$ pkg-config opencv
--libs-L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui
-lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d
-lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$
Run Code Online (Sandbox Code Playgroud)
但即使这样做也行不通:
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$ g++ -Wall em.cpp
`pkg-config opencv --cflags --libs`
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$ ./a.out
./a.out: error while loading shared libraries: libopencv_core.so.2.3:
cannot open shared object file: No such file or directory
fagg@hubble:~/src/OpenCV-2.3.1/samples/cpp$
Run Code Online (Sandbox Code Playgroud)
我认为链接存在问题,但我不太清楚发生了什么.这是一个全新的OpenCV安装 …
是否存在允许人们在通道中添加所有元素的内在因素?我正在使用Neon将8个数字相乘,我需要对结果求和.这里有一些释义代码来展示我目前正在做的事情(这可能会被优化):
int16_t p[8], q[8], r[8];
int32_t sum;
int16x8_t pneon, qneon, result;
p[0] = some_number;
p[1] = some_other_number;
//etc etc
pneon = vld1q_s16(p);
q[0] = some_other_other_number;
q[1] = some_other_other_other_number;
//etc etc
qneon = vld1q_s16(q);
result = vmulq_s16(p,q);
vst1q_s16(r,result);
sum = ((int32_t) r[0] + (int32_t) r[1] + ... //etc );
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我似乎在将相机设置为以 240 FPS 录制时遇到问题,但由于某种原因,输出文件仅为 30 FPS。
这是我设置相机的代码(首先实例化):
class HFRCamera {
public:
HFRCamera();
AVCaptureDeviceInput *camera;
AVCaptureDeviceInput *microphone;
AVCaptureDevice *videoCam;
AVCaptureDevice *audioInput;
AVCaptureSession *capSession;
void start();
void config();
void stop();
};
HFRCamera::HFRCamera() {
// Set up capture session and add video camera and microphone
this->capSession = [[AVCaptureSession alloc] init];
this->videoCam = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
this->config();
}
void HFRCamera::start() {
[this->capSession startRunning];
}
void HFRCamera::stop() {
[this->capSession stopRunning];
}
void HFRCamera::config() {
const CGFloat desiredFPS = 240;
AVCaptureDeviceFormat *selectedFormat = nil;
AVFrameRateRange *frameRateRange = …Run Code Online (Sandbox Code Playgroud) 假设我有一些具有共同父代的类型集:
struct some_tag;
struct A : some_tag;
struct B : some_tag;
struct C : some_tag;
struct D : some_tag;
Run Code Online (Sandbox Code Playgroud)
可以单独测试一个类型是否是以下项的子项some_tag:
template <typename T>
using has_some_tag = std::is_base_of<some_tag, T>;
Run Code Online (Sandbox Code Playgroud)
但是,比方说,我有一些变体,可以接受任何数量和这些类型的任何组合,例如:
using variant_1 = std::variant<A,B,C>;
using variant_2 = std::variant<B,C>;
using variant_3 = std::variant<D,A>;
...
Run Code Online (Sandbox Code Playgroud)
然后,假设我正在使用这些变量类型作为模板参数传递给某个具有访问逻辑以处理每种类型的类。
template <typename V>
struct some_other_type;
Run Code Online (Sandbox Code Playgroud)
对于type V,我希望具有static_assertions,它满足以下条件:
V 是一个变体V是一个变体,仅接受从继承的类型some_tag。我想我把所有的小片段都放在一起,但是我无法找到检查变体类型的最佳方法。
我认为我需要的是一个特征,可以有效地断言每种基础类型都具有特定的特征。我应该指出,这里V只能做的假设就是只包含继承自的东西some_tag,但我们不能对此所涉及的东西的顺序或数量做假设。
有指针吗?