【问题标题】:Convert mwArray to std::vector<double>将 mwArray 转换为 std::vector<double>
【发布时间】:2020-02-19 11:02:30
【问题描述】:

我正在使用在 Matlab 中编码的特征匹配算法。我使用 Matlab 的库编译器为 C++ 创建了共享库。
结果,我得到了一个由 n 个特征点和点坐标 x,y(n 行,2 列)组成的 mwArray。现在我想将 mwArray 转换为 std::vector&lt;double&gt; 甚至更好的 std::vector&lt;cv::Point2d&gt;,这样我就可以继续了。

我尝试使用GetData() 方法,但我不知道必须使用哪些参数。 代码如下:

mclmcrInitialize();
    //const char *args[] = { "-nojvm" };
    //const int count = sizeof(args) / sizeof(args[0]);
    if (!mclInitializeApplication(NULL, 0)) {

        std::cerr << "Could not initialize the application properly" << std::endl;
        return -1;
    }

    if (!MatchingInitialize()) {
        std::cerr << "Could not initialize the library properly" << std::endl;
        return -1;
    }
    else {
        try {

            // Create the output arrays
            mwArray FSC_1, FSC_2, NBCS_1, NBCS_2;
            mwArray path_1 = "C:\\test\\img_1.jpg";
            mwArray path_2 = "C:\\test\\img_2.jpg";
            Matching(1, FSC_1, FSC_2, NBCS_1, NBCS_2, path_1, path_2);



            // Output that works            
            std::cout << "The value is " << FSC_1 << std::endl;

            // Conversions I tried
            double *FSC_1_Copy = mxGetPr(FSC_1.GetData());

            std::vector<double> FSC_1_Copy = FSC_1.GetData();

            std::vector<double> data_copy;
            FSC_1.GetData(data_copy, FSC_1.RowIndex());

        }
        catch (const mwException& e) {
            std::cerr << e.what() << std::endl;
            return -2;
        }
        catch (...) {
            std::cerr << "Unexpected error thrown" << std::endl;
            return -3;
        }
        MatchingTerminate();

    }

【问题讨论】:

  • 在 C++ 中,我这样做:float * var_C= static_cast&lt;float *&gt;(mxGetData(var_matlab));。也许与std::vector&lt;double&gt; 类似的东西是可能的。我怀疑你可以投到Point2D
  • @ThomasSablik 是的,我在添加评论时意识到,我的错误,我之前是用 C 做的。
  • 尝试类似double *FSC_1_Copy = static_cast&lt;double *&gt;(mxGetData(FSC_1)); 我得到错误no suitable conversion function from "mwArray" to "const mwArray" exists
  • 我看不懂代码。 FSC_1.GetData() 应该有返回类型 void。此参考是否正确:de.mathworks.com/help/compiler_sdk/cxx/mwarray.htmldouble *FSC_1_Copy = new double[FSC_1.NumberOfElements()]; FSC_1.GetData(FSC_1_Copy, FSC_1.NumberOfElements()); delete[] FSC_1_Copy;
  • 你也可以试试std::vector&lt;double&gt; FSC_1_Copy(FSC_1.NumberOfElements()); FSC_1.GetData(FSC_1_Copy.data(), FSC_1.NumberOfElements());

标签: c++ matlab opencv shared-libraries feature-extraction


【解决方案1】:

您可以将矩阵复制到一个向量中

// Create a vector with size FSC_1.NumberOfElements()
// FSC_1_Copy allocates memory for an array
std::vector<double> FSC_1_Copy(FSC_1.NumberOfElements());

// Copy up to FSC_1.NumberOfElements() elements from FSC_1 into
// the array of FSC_1_Copy
FSC_1.GetData(FSC_1_Copy.data(), FSC_1.NumberOfElements());

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多