【问题标题】:Cannot save 2D and 3D matrices to a file无法将 2D 和 3D 矩阵保存到文件中
【发布时间】:2021-10-30 01:14:17
【问题描述】:

我无法使用 Octave 将矩阵保存到文件中。这是发生了什么:

A = [1 2 3; 4 5 6; 7 8 9]
dlmwrite("test.data", A)

输出:

A =

   1   2   3
   4   5   6
   7   8   9

没有创建文件。

尝试保存 3D 矩阵:

A = [1 2 3; 4 5 6; 7 8 9]
A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]
dlmwrite("test.data", A)

输出:

A =

   1   2   3
   4   5   6
   7   8   9

A =

ans(:,:,1) =

   1   2   3
   4   5   6
   7   8   9

ans(:,:,2) =

   10   11   12
   13   14   15
   16   17   18

error: transpose not defined for N-D objects
error: called from
    dlmwrite at line 202 column 7
    test_3d at line 31 column 1

没有创建文件。

所以,我的问题是:

  • 为什么在这两种情况下都没有生成文件?
  • 当我不执行该操作时,转置的错误信息是什么意思?
  • 只有 Octave 会发生这种情况,还是 MATLAB 也会发生这种情况?

八度版本:6.3.0

【问题讨论】:

  • 我刚刚在 Matlab R2020a 中检查了这个。没有错误并生成文件。

标签: matlab file matrix octave


【解决方案1】:

我在我的机器上运行了测试,上帝在 Octave 5.1.0 上出现了类似的错误:

在我的情况下,我得到了错误:

error: transpose not defined for N-D objects
error: called from
    dlmwrite at line 195 column 7

在 dlmwrite.m (Octave\Octave-5.1.0.0\mingw64\share\octave\5.1.0\m\io\dlmwrite.m).script 我发现:

他们基本上是在尝试转置传入的数组。转置运算符是为二维数组定义的,而不是为三维数组定义的,这就是返回错误的原因。

我在 MATLAB R2020a 中运行了相同的测试,没有产生错误,并输出了一个文件 (test.data),内容如下:

1,2,3,10,11,12
4,5,6,13,14,15
7,8,9,16,17,18

在任何一种情况下,文档都没有明确提到数组的维度不能超过二维,但看起来 Matlab 函数被编写为支持超过二维,而 Octave 等效函数则不支持。

关于问题:

为什么在这两种情况下都没有生成文件?

由于 Octave 使用脚本来实现 dlmwrite,因此只要识别出错误,就不会解析脚本的其余部分。因此,没有创建文件

转置的错误信息是什么意思,我没有执行这样的操作?

错误消息表明 Octave 试图转置(翻转)超过二维的数组,转置运算符不支持此操作 (')。

这只发生在 Octave 上还是 MATLAB 上?

这在 MATLAB R2020a 中不会发生。看起来他们已经在这个函数中内置了对多维数组的支持。

创建一个 Octave 错误 (https://www.gnu.org/software/octave/bugs) 可能是个好主意。 dlmwrite 函数应更新为支持多于两个维度,或者函数文档 (help dlmwrite) 应明确声明输入参数 M 的维度不得大于二维。

【讨论】:

  • "每当识别出错误时,脚本的其余部分都不会被解析。因此,不会创建文件" - 我的 2D 和 3D 测试脚本是分开的,所以 2D 应该正确运行直到它结束,应该创建一个输出文件。为什么这没有发生?
  • 是否有其他方法可以在 Octave 中保存/加载 3D 矩阵?
  • 我刚刚使用 octave-gui (CLI) 运行了 2D 案例。在我输入ls 后,我看到了文件test.data,其中包含预期的矩阵的二维版本。所以在我的系统上这个接缝工作。我想知道文件是否可以在其他路径中创建。您可能想尝试明确指定路径(例如"C:\...\test.data")。
  • 您可以使用save test.data A,默认情况下会将对象保存为二进制格式。然后可以稍后使用load test.data A 加载它。有一个-ascii 选项可以保存为文本格式,但这似乎与 3D 矩阵不兼容。
  • 你是对的,该文件默认创建在我的基本主目录中,而不是在脚本目录中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2015-02-04
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多