【问题标题】:How to store 3D matrix in text file so that it can be imported to Matlab?如何将 3D 矩阵存储在文本文件中,以便可以将其导入 Matlab?
【发布时间】:2012-10-26 09:18:59
【问题描述】:

我有一个文本文件作为 c++ 程序的输出。它实际上是一个 3x100x200 元素矩阵。超过 200 个时间戳的 3x100 2d 矩阵。我想存储它,以便我可以将它加载到 Matlab 工作区中,然后在 3d 图中将其可视化。我无法弄清楚文本文件的结构。至于我应该在哪里放一个“[..]”,在哪里放“;”以及“”或“,”的位置。

有人可以举个例子,以便我可以以这种方式从 c++ 代码中打印出文件

【问题讨论】:

    标签: c++ matlab io


    【解决方案1】:

    忘记文本文件。相反,使用Matio library 编写.mat 文件。这样您就可以在需要时快速添加更多数据字段。

    如果你真的想使用文本文件,你可以先写矩阵维度,然后是所有元素,最后按照here的建议进行一些整形。

    【讨论】:

      【解决方案2】:

      我发现了一个没有使用任何额外库的 hack。 我只是将每个二维矩阵输出为 outMat(:,:,matIndex) 并在循环中递增 matIndex 。然后我在 matlab 中将 .m 作为脚本运行。

      void printArrs(){
          int i;
      //  B(:,:,1) = [1 2 3; 4 5 6];
      //  B(:,:,2) = [7 8 9; 0 0 0];
          ofstream outFile;
          outFile.open ("forPlot.m", ios::out | ios::app);
          matIndex++;
          outFile << "outMat(:,:," << matIndex << ") = [";
          for(i=0;i<fftLen;i++){
              outFile << Mag[0][i] << " ";
              outFile << Mag[1][i] << " ";
              outFile << Mag[2][i] << ";" << endl;
          }
          outFile << "];" << endl;
          outFile.close();
      }
      

      感谢大家的回答。 对于某些答案,我猜我不够清楚,因为他们认为我想写“来自”Matlab 而不是“到”Matlab,而这是另一种方式。

      【讨论】:

      • 如果您指的是我的答案,我只是编写了 matlab 脚本,以便您可以查看 matlab 中生成的data.txt 并在 C++ 中生成相同外观的东西。这很简单。关键是你必须编写二维数组并重塑。但是,您可以简单地编写一个 .m 文件,这确实是事实 :) 干得好。尽管考虑更大矩阵的二进制输出。它快得多
      【解决方案3】:

      尝试谷歌搜索“.csv”以找出逗号分隔的变量文件是什么。这应该会有所帮助,如果我没记错的话,您可以将它们导入 Matlab。

      【讨论】:

        【解决方案4】:

        如果你真的想使用文本文件,虽然我建议你去使用前面提到的 Matio 库,你可以通过将其重塑为 2D 来保存 3D 数组,然后将其重塑为阅读后的 3d。看看这个简单的 MATLAB 代码。它将 3D 矩阵写入 csv 文件。写入后,csv 文件包含一个二维矩阵,其中第二维和第三维作为向量流式传输:

        A = rand(3,10,10);
        csvwrite('data.txt', A);
        
        B = csvread('data.txt');
        % B is now 3 x 100 matrix, so you need to reshape
        B = reshape(B, 3, 10, 10);
        

        【讨论】:

          【解决方案5】:

          最好将其保存为 .mat 文件。这样您就不必担心文件结构了。
          请参阅save 函数的文档。 编辑:我误读了这个问题,没有意识到您正在尝试将矩阵保存在 C++ 中。我建议你听从 Pukku 的建议并使用 Matio 库。

          load Matlab 中的 .mat 文件,只需使用

          load('myfile.mat')
          

          这会将矩阵放入您的工作区。

          【讨论】:

          • 但是 OP 不是用 C++ 程序编写的吗?无论如何,我很喜欢使用 Matio 库在我的 C++ 程序中编写 .mat 文件,sourceforge.net/projects/matio
          • @Pukku:你说得对,我不知何故跳过了问题中的“C++”。但 Matio 似乎很有用。
          猜你喜欢
          • 2013-10-24
          • 1970-01-01
          • 2014-09-12
          • 2014-04-30
          • 1970-01-01
          • 1970-01-01
          • 2015-02-16
          • 1970-01-01
          • 2013-09-21
          相关资源
          最近更新 更多