C++ C+中的Matlab型阵列+;
如何像我在matlab中那样在C++/Open CV中定义数组 例如: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(
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)