2012-07-31 43 views
10

如何在matlab中定義C++/Open CV中的數組?C++中的Matlab類型數組

例如:

x=a:b:c; 

y=linspace(a,b,n); 
+0

對於類似問題[這裏](https://stackoverflow.com/a/27030598/3079302)的好答案。 – iled 2017-08-22 05:16:54

回答

9

請參考前面的答案爲您的問題的一般答案。

具體而言,爲了解決你提到的兩個例子,這裏是一些等效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; 
} 
+1

預分配使用'n'值填充'array',然後'push_back'附加'n'值到最後,所以您應該放棄預分配 – YuppieNetworking 2013-07-22 15:20:29

+0

謝謝@YuppieNetworking。我混淆了語言,認爲分配的構造函數沒有填充。由於使用'push_back',我刪除了預分配。 – mattgately 2013-08-06 15:28:00

+0

@mattgately,你可以使用'reserve'功能更有效。 – 2015-07-06 08:42:45

3

的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()

但對於大多數像linspacemagic或無論是棘手的Matlab的功能,有在OpenCV中沒有記者,主要是因爲OpenCV的不是數學包,但計算機視覺之一。如果你需要一些特定的功能,你可以將它克隆到你的項目中(也可以自己寫)

3

不幸的是,C++沒有內置任何內置的功能來允許這種矩陣初始化。它支持多維數組,但您需要自己初始化每個元素。 C++是比Matlab更低級別的語言,它涉及更多的工作來編寫創建和初始化矩陣類型變量的功能。

話雖如此,有很多庫可用於C++,使數值計算比您自己嘗試編寫它更容易。如果你需要考慮使用庫,看看這個鏈接,建議幾個合適的https://scicomp.stackexchange.com/questions/351/recommendations-for-a-usable-fast-c-matrix-library

1

這是一個簡單的實現,如果你使用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; 
} 
1
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; 
+1

你的回答應該包含你的代碼的解釋和描述它是如何解決問題的。 – AbcAeffchen 2014-12-11 00:49:28

1

這裏是我的測試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; 
} 
+0

當n = 1時被零除的經典錯誤...我發佈了一些細微的更改(請參見下文) – champost 2016-01-04 20:34:38

0

@吉拉德的回答上述病例的擴展時n=0n=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; 
} 
+0

當step是-ve時,您的代碼無法處理這種情況。 (b> a或b ankittie 2017-07-11 17:40:45

+0

@ankittie是什麼讓你說,你有沒有嘗試過的代碼? 'step'是'double'類型,可以是+ ve或-ve。 – champost 2017-07-12 18:14:04

1

我想對mattgately提出的代碼稍加修改。我用它也有一些情況下,當step計算不正確,由於分工逼近

double step = (b-a)/(n-1); 

我只是增加了少量的while條件:

while(a <= b+0.00001) 

喜歡這個跟我的工作和正確的間隔數被創建。