2014-11-19 4 views
4

im пытается написать аналогичную версию функции numpy.linspace на python.python linspace в C++

double linspace(int a, int b, int c){ 
    double line[c]; 
    double delta =b-a/(c-1); 
    for (int i=0; i<c; ++i){ 
      line[i]=0 + (i*delta); 
    } 
    return line; 

с а и б, являющейся первым и последний компонент в массиве, и с указанием количества элементов в массиве. Но когда я скомпилирую этот скрипт, он возвращает:

linspace.cpp: In function ‘double linspace(int, int, int)’: 
linspace.cpp:11:9: error: cannot convert ‘double*’ to ‘double’ in return 
    return line; 
     ^

может кто-нибудь случайно решить, как решить эту проблему?

+0

Кроме того, 'ба/(c-1) '(вы имели в виду' (ba)/(c-1) '?) - целочисленное деление. –

ответ

3

Что вы пытаетесь сделать, что не будет работать. Во-первых вы выделения памяти в стеке ТЕЧЕНИЕ linspace с

double line[c]; 

Вы либо новый для выделения памяти перед вызовом и передать его, или передать его динамически и вернуть его (и не забудьте освободить его позже) ,

Чтобы выделить динамически вы можете сделать следующее:

double * line = new double[c]; 

Опять же, это должны быть освобождены как и в какой-то момент позже, когда вы закончите с этим, в противном случае вы будете иметь утечку памяти.

delete line[]; 

Также double line[c]; создает массив двойников и line указывает на то. Таким образом, строка double *. Вы указали тип возвращаемого значения функции, как double

+0

Пример чего? Если вы измените 'double line [c];' to 'double * line = new double [c]; 'и измените тип возвращаемого значения функции, которую вы выполнили. Всякий раз, когда вы закончите с данными, все, что возвращается из этой функции, необходимо удалить. Итак ... 'double * lin_ret = linspace (a, b, c);' После того, как вы закончили с 'lin_ret' do' delete lin_ret []; ' – sedavidw

+0

Ha! * Asker *, запрашивающий пример! Это богато. – farenorth

+2

Вы действительно должны использовать вектор для этого, а не голый 'новый'. –

6

Как о чем-то вроде этого:

#include <iostream> 
#include <vector> 

template<typename T> 
std::vector<double> linspace(T start_in, T end_in, int num_in) 
{ 

    std::vector<double> linspaced; 

    double start = static_cast<double>(start_in); 
    double end = static_cast<double>(end_in); 
    double num = static_cast<double>(num_in); 

    if (num == 0) { return linspaced; } 
    if (num == 1) 
    { 
     linspaced.push_back(start); 
     return linspaced; 
    } 

    double delta = (end - start)/(num - 1); 

    for(int i=0; i < num-1; ++i) 
    { 
     linspaced.push_back(start + delta * i); 
    } 
    linspaced.push_back(end); // I want to ensure that start and end 
          // are exactly the same as the input 
    return linspaced; 
} 

void print_vector(std::vector<double> vec) 
{ 
    std::cout << "size: " << vec.size() << std::endl; 
    for (double d : vec) 
    std::cout << d << " "; 
    std::cout << std::endl; 
} 

int main() 
{ 
    std::vector<double> vec_1 = linspace(1, 10, 3); 
    print_vector(vec_1); 

    std::vector<double> vec_2 = linspace(6.0, 23.4, 5); 
    print_vector(vec_2); 

    std::vector<double> vec_3 = linspace(0.0, 2.0, 1); 
    print_vector(vec_3); 

    std::vector<double> vec_4 = linspace(0.0, 2.0, 0); 
    print_vector(vec_4); 


    return 0; 
} 

C++ результат:

size: 3 
1 5.5 10 
size: 5 
6 10.35 14.7 19.05 23.4 
size: 1 
0 
size: 0 

Numpy результат:

In [14]: np.linspace(1, 10, 3) 
Out[14]: array([ 1. , 5.5, 10. ]) 

In [15]: np.linspace(6, 23.4, 5) 
Out[15]: array([ 6. , 10.35, 14.7 , 19.05, 23.4 ]) 

In [16]: np.linspace(0.0, 2.0, 1) 
Out[16]: array([ 0.]) 

In [17]: np.linspace(0.0, 2.0, 0) 
Out[17]: array([], dtype=float64) 
+0

Ваш шаблон выходит из строя для меня, я скопировал его дословно и получил ошибку диапазона для вектора. –

+0

@arc_lupus. Спасибо, что указали это! Полагаю, я это исправил. Я скомпилировал его так и работал правильно: 'g ++ -std = C++ 11 my_file.cpp -o my_exec'. – Akavall

+0

Мне пришлось удалить «linspaced.push_back (end)»; команда, поскольку она создавала «end_in» два раза. –

Смежные вопросы