【问题标题】:approach to save and load a 3D matrix保存和加载 3D 矩阵的方法
【发布时间】:2020-09-15 20:00:23
【问题描述】:

我需要将 3D 矩阵保存在将在 Matlab 中加载的文本文件中(我不掌握)。我的第一个想法是使用这样的 .csv 文件(考虑 3x3x3 矩阵):

        row 1: v[0][0][0],v[0][0][1] ,v[0][0][2]
        row 2: v[0][1][0],v[0][1][1] ,v[0][1][2]
        row 3: v[0][2][0],v[0][2][1] ,v[0][2][2]
        row4: v[1][0][0],v[1][0][1] ,v[1][0][2] 
        ...

像这样,我必须单独告知用户 x 和 y 维度的数量。不太干净,但不是大戏。

我的问题是,我如何在 Matlab 中加载和绘制这样的数据集?值为 1/0。

有没有更聪明的方法来做到这一点。我正在从 Java 导出。

谢谢!

【问题讨论】:

  • dlmread 读取二维数组。 reshape 可以将其重塑为 3D。如果你写的顺序正确,就是1行操作。
  • 只需使用saveloadsave 有一种模式,如果必须,它会以文本格式保存,但默认的二进制格式更有效。

标签: matlab matrix file-io text-files


【解决方案1】:

我想不出一种可以省略存储矩阵维度的方法(至少应该提到其中的两个)。但是当涉及到在文件中存储值时,我建议您甚至不要费心以表格格式编写它们。关于 MATLAB,您只需要了解矩阵中元素的顺序即可。看看这个例子:

%% create a 3d matrix
% a = 1+randi(5);
% b = 1+randi(5);
% c = 1+randi(5);
a = 2; b = 3; c = 4;
M = reshape(1:a*b*c, a, b, c)

这是矩阵的样子:

M(:,:,1) =

 1     3     5
 2     4     6

M(:,:,2) =

 7     9    11
 8    10    12

M(:,:,3) =

13    15    17
14    16    18

M(:,:,4) =

19    21    23
20    22    24

现在让我们把它写到一个文本文件中:

%% writing matrix in the text file,
%  translate it to your target language
fid = fopen('matrix.txt', 'w');
fprintf(fid, '%d,%d,%d\n', a, b, c);
for k=1:c
    for j=1:b
        for i=1:a
            fprintf(fid, '%-.8g\n', M(i, j, k));
        end
    end
end
fclose(fid);

这是文件的内容:

2,3,4
1
2
3
4
...
21
22
23
24

现在,读取文件:

%% read the file back in MATLAB
fid = fopen('matrix.txt', 'r');
sz = str2num(fscanf(fid, '%s\n', 1)); % read dimensions
M2 = reshape(fscanf(fid, '%f\n', inf), sz); % read values
fclose(fid);

%% test the imported matrix
disp(sz)
if all(all(all(M == M2)))
    disp('OK')
else
    disp('Test failed.')
end

【讨论】:

  • 你不需要循环,fprintf(fid, '%-.8g\n', M) 会做同样的事情。
  • @CrisLuengo 当然可以,但我认为 OP 需要用另一种语言实现该部分,他们说他们对 matlab 不太熟悉。
  • 解释的超级清楚!非常感谢您的时间。 :)
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2021-10-30
  • 2015-10-17
  • 2015-10-18
  • 2022-10-15
相关资源
最近更新 更多