matlabで行うようにC++/ Open CVで配列を定義する方法は?
例えば:
x=a:b:c;
また
y=linspace(a,b,n);
質問に対する一般的な回答については、前の回答を参照してください。
具体的には、あなたが言及した2つの例に対処するために、あなたが言及した(テストされていない)配列を動的に生成するためのベクトルを使用した同等の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()
しかし、OpenCVは数学パッケージではなく、コンピュータービジョンパッケージであるため、OpenCVには対応するものがありませんlinspace
。magic
特定の関数が必要な場合は、プロジェクトに複製できます(自分で作成することもできます)。
残念ながら、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で、他のすべてと非常に似ていますが、すべてのケースを処理します。
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)
このようにそれは私と一緒に働き、正しい間隔の数が作成されました。
後者がゼロ除算を引き起こす場合n=0
と理由のための上記の@Giladの答えの拡張。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;
}