我想编写一个 C++ 函数来查找循环数据数组的中位数。例如,考虑指南针的读数,其中读数假定在 [0,360) 内。虽然 1 和 359 看起来很远,但由于读数的循环性质,它们非常接近。
求普通数据中 N 个元素的中位数如下。1. 对 N 个元素的数据进行排序(升序或降序) 2. 如果 N 为奇数,则中位数为排序数组中的第 (N+1)/2 个元素。3.如果N是偶数,中位数是排序数组中第N/2和第N/2+1个元素的平均值。
然而,循环数据中的环绕问题将问题带到了不同的维度,并且解决方案并不简单。
这里解释了从循环数据中查找平均值的类似问题如何计算一组循环数据的平均值? 上面链接中的建议是找到每个角度对应的单位向量并求平均值。然而,中位数需要对数据进行排序,而向量排序在这种情况下没有任何意义。因此,我认为我们不能使用提议的方案来找到中位数!
请考虑以下代码.
const int N = 100;
const float alpha = 0.9;
Eigen::MatrixXf myVec = Eigen::MatrixXf::Random(N,1);
Eigen::MatrixXf symmetricMatrix(N, N);
for(int i=0; i<N; i++)
for(int j=0; j<=i; j++)
symmetricMatrix(i,j) = symmetricMatrix(j,i) = i+j;
symmetricMatrix *= alpha;
symmetricMatrix += ((1-alpha)*myVec*myVec.adjoint());
Run Code Online (Sandbox Code Playgroud)
它基本上实现了指数平均.我知道最后一行可以通过以下方式进行优化.
symmetricMatrix_copy.selfadjointView<Eigen::Upper>().rankUpdate(myVec, 1-alpha);
Run Code Online (Sandbox Code Playgroud)
我想知道我是否能以有效的方式结合最后两行.总之,我想计算 A = alpha*A+(1-alpha)*(x*x').
我有以下C++代码,我使用了Eigen C++ Library.
#include "Dense"
#include <iostream>
int main()
{
Eigen::MatrixXf x(10,10);
x.setRandom();
std::cout<<"x is ..\n"<<x<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我用"-std = gnu ++ 11"尝试g ++时,它会出现以下错误.
In file included from /usr/include/c++/4.8/tuple:39:0,
from /usr/include/c++/4.8/functional:55,
from ../SP_ToolBox/ExternalLibraries/Eigen/Eigen/Core:153,
from ../SP_ToolBox/ExternalLibraries/Eigen/Eigen/Dense:1,
from test.cpp:1:
../SP_ToolBox/ExternalLibraries/Eigen/Eigen/array:8:4: error: #error The Eigen/Array header does no longer exist in Eigen3. All that functionality has moved to Eigen/Core.
#error The Eigen/Array header does no longer exist in Eigen3. All that functionality has moved to Eigen/Core.
^
In file included from /usr/include/c++/4.8/functional:55:0, …Run Code Online (Sandbox Code Playgroud) 我在我的C++程序中使用外部库.这个库有一个名为"Common.h"的文件.在不知道这个文件的情况下,我还在程序中创建了一个"Common.h".在头文件中使用编译器标志"#pragma once",我可以确保两个文件都可以包含在编译中.但是,我意识到当我在程序中调用我的"Common.h"时,预处理器错误地包含了来自外部库的"Common.h",它打破了编译.有没有像"命名空间"这样的选项,它允许我包含正确的文件.我觉得这很困难,因为我们可能(实际上不需要)了解外部库中的所有文件.
如何识别模板参数是否是std::complex?我想要一个支持所有数据类型的通用方法,如float,double,int等.我知道使用std :: is_same我可以专门检查给定的类型,例如std::complex<float>.但在这里我需要一个通用的方法.
我的代码中有以下行:
#include <atomic>
std::atomic_uint32_t tmp;
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下编译错误:
命名空间'std'中的'atomic_uint32_t'未命名类型.
我包括<cstdint>但错误仍然存在.
我的GCC版本:5.4.0,Ubuntu 14.04(64位)
我想在我的应用程序中使用 C 库和 C++11 库。C 和 C++11 库中“复杂”的用法似乎发生冲突,并产生编译错误。此处给出了 MWE。
myLib_C.h 的内容:
#ifndef MYLIBC_H
#define MYLIBC_H
#include <math.h>
#include <complex.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef float complex cfloat;
typedef double complex cdouble;
#define myFunc_cfloat(r,i) ((float)(r) + ((float)(i))*I)
#define myFunc_cdouble(r,i) ((double)(r) + ((double)(i))*I)
#ifdef __cplusplus
} // extern "C"
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
myLib_CPP.h 的内容:
#ifndef MYLIBCPP_H
#define MYLIBCPP_H
#include "myLib_C.h" //uses myLib_C somewhere in this file
#include <iostream>
#include <complex>
inline void CppFunction()
{
std::cout<<"This file need to be compiled using …Run Code Online (Sandbox Code Playgroud) 我认为,即使函数实际上没有返回任何内容,最好返回一个整数.返回的值可用于反映函数内的各种错误条件.我们通过在C++中选择整数返回函数而不是"void"函数来支付任何代价吗?
请考虑以下代码.
class MyClass1
{
public:
MyClass1(const int& i)
{
myVar = i;
}
const int& get() const
{
std::cout<<"Inside 1 \n";
return myVar;
}
int get()
{
std::cout<<"Inside 2 \n";
return myVar;
}
private:
int myVar;
};
class MyClass2
{
public:
MyClass2(const int& i)
{
myVar = i;
}
const int& get()
{
std::cout<<"Inside 3 \n";
return myVar;
}
int get() const
{
std::cout<<"Inside 4 \n";
return myVar;
}
private:
int myVar;
};
int main(int argc, char* argv[])
{
MyClass1 …Run Code Online (Sandbox Code Playgroud) 我在C中有以下两个函数.
float floatAdd(float a, float b)
{
return a+b;
}
double doubleAdd(double a, double b)
{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想结合两个函数并在C++中编写一个tempalte函数,如下所示.
template<class T>
T add(T a, T b)
{
// if T=float, return floatAdd(a,b)
// if T=double, return doubleAdd(a,b)
}
Run Code Online (Sandbox Code Playgroud)
由于返回类型不同,我无法找到解决方案!
请注意,上述功能非常简单,仅用作示例.我的目的是为一些Legacy C函数提供一个C++模板包装器.
c++ ×8
c++11 ×4
eigen3 ×2
templates ×2
algorithm ×1
c ×1
complextype ×1
eigen ×1
function ×1
gcc ×1
median ×1
overloading ×1
typechecking ×1
void ×1