C++中的Matlab类型数组

Matlab type arrays in C++

本文关键字:数组 类型 Matlab 中的 C++      更新时间:2023-10-16

如何像在matlab中那样在C++中定义数组/打开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功能,如linspacemagic或其他什么,OpenCV中没有对应程序,主要是因为OpenCV不是一个数学包,而是一个计算机视觉包。如果你需要一些特定的功能,你可以在你的项目中克隆它(也就是自己写)

不幸的是,C++没有内置任何东西来允许这种矩阵初始化。它支持多维数组,但您需要自己初始化每个元素。C++是一种比Matlab更低级别的语言,它涉及到更多的工作来编写创建和初始化矩阵类型变量的功能。

话虽如此,有许多库可用于C++,使数值计算比您尝试自己编写更容易。如果你需要考虑使用库,可以看看这个链接,它提供了一些合适的库https://scicomp.stackexchange.com/questions/351/recommendations-for-a-usable-fast-c-matrix-library

如果使用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;
}
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;

这是我测试过的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=0n=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;
}