如何像在 matlab 中一样在 C++/Open CV 中定义数组?
例如:
x=a:b:c;
或者
y=linspace(a,b,n);
有关您问题的一般答案,请参阅以前的答案。
具体来说,为了解决您提到的两个示例,这里是一些使用向量来动态生成您提到的数组的等效 C++ 代码(尚未测试):
#include <vector>
using std::vector;
vector<double> generateRange(double a, double b, double c) {
vector<double> array;
while(a <= c) {
array.push_back(a);
a += b; // could recode to better handle rounding errors
}
return array;
}
vector<double> linspace(double a, double b, int n) {
vector<double> array;
double step = (b-a) / (n-1);
while(a <= b) {
array.push_back(a);
a += step; // could recode to better handle rounding errors
}
return array;
}
OpenCV 提供了一些类似于 Matlab 的功能,但数量非常有限。
你可以
cv::Mat a = cv::Mat::eye(5);
cv::Mat b = cv::Mat::zeros(5);
cv::Mat img = cv::imread("myGorgeousPic.jpg");
cv::imwrite(img, "aCopyOfMyGorgeousPic.jpg");
它还支持diag()
但是对于大多数棘手的 Matlab 功能,如linspace
或magic
或其他,在 OpenCV 中没有对应的,主要是因为 OpenCV 不是一个数学包,而是一个计算机视觉包。如果你需要一些特定的功能,你可以在你的项目中克隆它(也就是你自己写的)
不幸的是,C++ 没有内置任何东西来允许这种矩阵初始化。它支持多维数组,但您需要自己初始化每个元素。C++ 是一种比 Matlab 低级的语言,它涉及更多的工作来编写创建和初始化矩阵类型变量的功能。
话虽如此,有许多库可与 C++ 一起使用,它们使数值计算比你自己尝试编写它更容易。如果您需要考虑使用库,请查看此链接,其中建议了一些合适的链接 https://scicomp.stackexchange.com/questions/351/recommendations-for-a-usable-fast-c-matrix-library
double* linspace(int xi, int xf, unsigned int n){
double *vec ;
vec = new double[n];
float esp, falt=xf-xi;
esp=falt/(n-1);
vec[0]=xi;
for(int i=1; i<n; i++)
vec[i]=vec[i-1]+esp;
return vec;
如果您使用 openCV,这是一个简单的实现。
Mat linspace(double &startP,double &Endp,int &interval)
{
double spacing = interval-1;
Mat y(spacing,1,CV_64FC1);
for (int i = 0; i < y.rows; ++i)
{
y.at<double>(i) = startP + i*(Endp - startP)/spacing;
}
return y;
}
这是我测试过的 linspace,与其他所有的 linspace 非常相似,但可以处理所有情况:
vector<double> Utilities::Linspace(double a, double b, int n) {
vector<double> array;
double epsilon = 0.0001;
double step = (b-a) / (n-1);
if (a==b)
{
for (int i = 0; i < n; i++)
{
array.push_back(a);
}
}
else if (step >= 0)
{
while(a <= b + epsilon)
{
array.push_back(a);
a += step;
}
}
else
{
while(a + epsilon >= b )
{
array.push_back(a);
a += step;
}
}
return array;
}
我想对 mattgately 提出的代码稍加修改。我使用了它,在某些情况下step
由于除法近似而无法正确计算
double step = (b-a) / (n-1);
我只是在while
条件中添加了一个小数字:
while(a <= b+0.00001)
像这样它与我一起工作,并创建了正确数量的间隔。
扩展@Gilad 上面的答案,n=0
因为n=1
后者导致除以零的情况。
vector<double> linspace(double a, double b, int n) {
vector<double> array;
if ((n == 0) || (n == 1) || (a == b))
array.push_back(b);
else if (n > 1) {
double step = (b - a) / (n - 1);
int count = 0;
while(count < n) {
array.push_back(a + count*step);
++count;
}
}
return array;
}