将矩阵保存到变量中给出的文件

时间:2012-11-11 21:32:55

标签: matlab octave

我想要做的很简单。这有效:

save weights.txt weights

但这不是:

filename = "weights.txt"
save filename weights

好吧,它确实将矩阵weights保存到名为filename的文件中......而不是weights.txt

我试过

save("-ascii", filename, "weights");

但它很糟糕,因为矩阵的名称必须是一个字符串。此外,这不起作用。 Octave说它无法将NDArray(?)转换为矩阵。

为什么呢?如何使它工作?

2 个答案:

答案 0 :(得分:0)

您可以使用dlmwrite来编写分隔的ASCII数据:

>> filename = "weights.txt";
>> weights = rand(3,3);
>> dlmwrite(filename, weights)
>> type weights.txt

0.16218,0.52853,0.26297
0.79428,0.16565,0.65408
0.31122,0.60198,0.68921

默认情况下,这是逗号分隔的,但您可以将自己的分隔符作为第三个参数传递。

编辑:

那么,MATLAB将允许您使用dlmwrite保存任何维度的数组,并且您可以使用dlmread读回数据。但是,正如carandraug指出的那样,ASCII表示最多只能是2D(MATLAB会使额外的维度变平)。如果您还在某处保存导出矩阵的形状,您仍然可以恢复此信息:

>> shape = "shape.txt";
>> weights = rand(3,3,3);
>> dlmwrite(filename, weights, 'precision', 17)
>> dlmwrite(shape, size(weights))
>> M = reshape(dlmread(filename), dlmread(shape));
>> all(M(:) == weights(:))
ans =
     1

与使用MATLAB的原生save weights; load weights相比,这当然有点麻烦。

答案 1 :(得分:0)

那里有两个问题:

  1. 使用save作为命令并传递变量或函数但不传递变量名作为字符串。没有办法解决这个问题。命令形式的工作方式是将每个参数转换为字符串。当您执行save weights.txt weights时,这会被解释为save ("weights.txt", "weights"),当您执行save filename weights时,它与save ("filename", "weights")相同,因此它会保存在名为filename的文件中。为什么你必须在字符串中传递变量名而不是变量本身?想象一下,您尝试保存的变量是一个字符串。 save如何知道它是否应该保存字符串或名为字符串的变量?

  2. 使用-ascii选项保存NDArray。你不能这样做,你需要使用另一种格式。如果您希望它位于文本文件中,请使用-text代替ascii。 text是一种格式,它还可以保存有关矩阵尺寸的信息,因此可以正确保存和加载任何尺寸的矩阵。在ascii格式中,所有信息都将丢失,因此任何超过2维的矩阵都将失败。尝试x = rand (3); save -ascii x_ascii.txt x; save -text x_text.txt x并查看文件内部以查看差异。如果它是一个3D矩阵,你能想到一种将x保存为ascii的方法吗?