Матрицы типа Matlab в С++

Как определить массивы в С++/Открыть CV, как и в Matlab?

например:

x=a:b:c;

или

y=linspace(a,b,n);

Ответ 1

Обратитесь к предыдущим ответам за общие ответы на ваш вопрос.

В частности, чтобы рассмотреть два примера, которые вы упомянули, вот несколько эквивалентных С++ -кодов с использованием векторов для динамического создания массивов, которые вы упомянули (не протестировали):

#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;
}

Ответ 2

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 не является пакетом математики, а является компьютерным. Если вам нужна какая-то конкретная функция, вы можете клонировать ее в своем проекте (иначе напишите ее самостоятельно)

Ответ 3

К сожалению, С++ не имеет ничего встроенного в него, чтобы разрешить такую ​​инициализацию матрицы. Он поддерживает многомерные массивы, но вам нужно будет инициализировать каждый элемент самостоятельно. С++ - это язык более низкого уровня, чем Matlab, и он требует гораздо больше работы для написания функций для создания и инициализации переменной типа матрицы.

Сказав, что существует несколько библиотек, доступных для использования с С++, которые упрощают численное вычисление, чем если бы вы пытались написать все это самостоятельно. Если вам нужно рассмотреть возможность использования библиотек, посмотрите на эту ссылку, которая предлагает несколько подходящих https://scicomp.stackexchange.com/questions/351/recommendations-for-a-usable-fast-c-matrix-library

Ответ 4

Это простая реализация, если вы используете 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;
}

Ответ 5

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;

Ответ 6

вот мое испытанное 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;
}

Ответ 7

Я хотел бы добавить небольшое изменение в код, предложенный mattgately. Я использовал его, и есть случаи, когда step неправильно вычисляется из-за аппроксимации деления

double step = (b-a) / (n-1);

Я добавил небольшое число в условие while:

while(a <= b+0.00001)

Таким образом, он работал со мной, и было создано правильное количество интервалов.

Ответ 8

Расширение ответа @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;
}