python linspace in c++

python linspace in c++

本文关键字:c++ in linspace python      更新时间:2023-10-16

im 试图编写类似版本的 Python numpy.linspace 函数。

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;

A 和 B 是数组中的第一个和最后一个组件,C 指定数组中元素的数量。但是当我编译这个脚本时,它返回:

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

有人碰巧知道如何解决这个问题吗?

像这样的事情怎么样:

#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

数字结果:

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)

你正在尝试做的事情是行不通的。 首先,您将在堆栈上分配内存 linspace

double line[c];

您要么在调用之前重新分配内存并将其传入,要么动态分配内存并返回它(并记住稍后释放它)。

要动态分配,您可以执行以下操作:

double * line = new double[c];

同样,这将需要在稍后完成的某个时候释放,否则您将出现内存泄漏。

delete line[];

此外,double line[c];会创建一个双精度数组,并line指向此。 所以线是一个double *. 您将函数的返回类型指定为 double