Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的Matlab型阵列+;_C++_Arrays_Matlab_Opencv - Fatal编程技术网

C++ C+中的Matlab型阵列+;

C++ C+中的Matlab型阵列+;,c++,arrays,matlab,opencv,C++,Arrays,Matlab,Opencv,如何像我在matlab中那样在C++/Open CV中定义数组 例如: x=a:b:c; 或 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中那样在C++/Open CV中定义数组

例如:

x=a:b:c;


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()


但是对于像
linspace
magic
之类的大多数棘手的Matlab功能,OpenCV中没有相应的工具,主要是因为OpenCV不是一个数学软件包,而是一个计算机视觉软件包。如果你需要一些特定的功能,你可以在你的项目中克隆它(AKA自己写)

< P>不幸的是C++没有内置到它中,允许这种矩阵初始化。它支持多维数组,但您需要自己初始化每个元素。C++是一种较低级别的语言,它涉及到编写函数并创建矩阵类型变量的工作。p>

曾经说过,C++中有许多库可以使数值计算比你自己尝试编写的更容易。如果你需要考虑使用库,请看这个链接,建议一些合适的词

参阅前面对你的问题的一般回答的答案。

具体地说,为了解决你提到的两个例子,这里有一些使用C++的代码,用于动态生成你提到的数组(未测试):

#包括
使用std::vector;
向量生成器(双a、双b、双c){
矢量阵列;

而(a如果使用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;
}
Mat-linspace(双开始、双结束、内部和间隔)
{
双间距=间隔-1;
材料y(间距1,CV_64FC1);
对于(int i=0;i >代码>双*林空间(int席,int xf,un签署int n){
双*vec;
vec=新的双精度[n];
浮动esp,falt=xf xi;
esp=falt/(n-1);
vec[0]=xi;

对于(int i=1;i,这里是我的测试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;
}
vector实用程序::Linspace(双a、双b、整数n){
矢量阵列;
双ε=0.0001;
双台阶=(b-a)/(n-1);
如果(a==b)
{
对于(int i=0;i=0)
{
while(a=b)
{
数组。推回(a);
a+=阶跃;
}       
}
返回数组;
}

对于
n=0
n=1
的情况,上述@Gilad答案的扩展,因为后者导致被零除

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;
}
向量linspace(双a,双b,int n){ 矢量阵列; 如果((n==0)| |(n==1)| |(a==b)) 数组。推回(b); 否则,如果(n>1){ 双台阶=(b-a)/(n-1); 整数计数=0; while(计数
我想对mattgately提出的代码稍加修改。我使用了它,并且在某些情况下,由于除法近似,
步骤
计算不正确

double step = (b-a) / (n-1);
我刚刚在
条件中添加了一个小数字,而
条件:

while(a <= b+0.00001)

while(一个预分配用
n
值填充
array
,然后
push_-back
n
值附加到末尾,所以你应该删除preallocationsanks@YuppieNetworking。我混淆了语言,认为构造函数没有填充就分配了。我删除了预分配,因为使用了
push_-back
@mattgately,你可以使用
reserve
函数来提高效率。你的答案应该包含对你的代码的解释以及它如何解决问题的描述。当
n=1
时,经典的零除错误…我发布了一些细微的更改(见下文)当步骤为-ve时,你的代码无法处理这种情况。(b)a或b@ankittie是什么让你这么说的,你试过代码了吗?
step
double
类型,可以是+ve或-ve。这是一个类似问题的好答案。
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;
}
double step = (b-a) / (n-1);
while(a <= b+0.00001)