如何将3D矩阵存储在文本文件中,以便可以导入Matlab?

3
我有一个文本文件,是由c++程序输出的。实际上它是一个3x100x200的元素矩阵。这个矩阵包含了200个时间戳的3x100二维矩阵。我想将其存储到Matlab工作区,并在三维图形中进行可视化。但我无法确定文本文件的结构。不知道应该在哪里放"[..]",在哪里放";",在哪里放" "或","。

请问有人能够给出一个示例,以便我可以从c++代码中以这种方式打印出文件吗?

5个回答

4
忘记使用文本文件。相反,使用Matio库编写.mat文件。这样,如果需要,您可以快速添加一些更多的数据字段。
如果您真的想使用文本文件,可以先写入矩阵维度,然后写入所有元素,最后按照此处建议进行一些重构。

3

我发现了一种无需使用额外库的技巧。我只是将每个2D矩阵输出为outMat(:,:,matIndex),并在循环中递增matIndex。然后我将.m文件作为脚本在Matlab中运行。

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 ++中产生相同外观的东西。这很简单。关键是你必须写2D数组和reshape。但是说实话,你可以简单地编写.m文件:)干得好。尽管考虑使用二进制输出来处理更大的矩阵。它快得多 - angainor

1

如果您真的想使用文本文件,尽管我建议您使用前面提到的Matio库,您可以通过将其重新塑造为2D进行写入,然后在读取时将其重新塑造为3D来保存3D数组。看一下这个简单的MATLAB代码。它将一个3D矩阵写入csv文件。写入后,csv文件包含作为向量流的第二和第三维的2D矩阵:

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);

1

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


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

要在Matlab中load .mat文件,只需使用以下命令:

load('myfile.mat')

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


但是,OP不是在用C++程序编写吗?无论如何,我很喜欢使用Matio库(http://sourceforge.net/projects/matio/)在我的C++程序中编写.mat文件。 - Reunanen
@Pukku:你说得对,我在问题中不小心跳过了“C ++”。但是Matio似乎非常有用。 - Junuxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接