C++中的Matlab类型数组
Matlab type arrays in C++
如何像在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功能,如linspace
或magic
或其他什么,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=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;
}
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 取消引用结束指针到数组类型的一个
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何在数组类型的模板代码中计算std::size_t
- LLVM 无法将数组类型强制转换为常量数组
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 特征:从数组类型中获取标量类型是否记录?
- T D[N] 总是声明数组类型的对象吗?
- 如何在模板中推断数组类型?
- 尝试使用 Array 类的模板构造整数数组时,错误:为什么数组类型"int [5]"不可分配,
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 如何为所有非数组类型专门化模板?
- 数组类型 (C++) 的初始化
- 我预测char数组类型值只能投射指针类型
- 将数组类型更改为 Int16 会节省存储空间吗?
- 采用通用数组类型的函数
- 数组类型 'int [8]'不可分配
- 数组类型 'float [size]'不可分配
- C++。候选模板被忽略 - 无法将数组类型与自身匹配