我想要做的很简单。这有效:
save weights.txt weights
但这不是:
filename = "weights.txt"
save filename weights
好吧,它确实将矩阵weights
保存到名为filename
的文件中......而不是weights.txt
。
我试过
save("-ascii", filename, "weights");
但它很糟糕,因为矩阵的名称必须是一个字符串。此外,这不起作用。 Octave说它无法将NDArray(?)转换为矩阵。
为什么呢?如何使它工作?
答案 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)
那里有两个问题:
使用save
作为命令并传递变量或函数但不传递变量名作为字符串。没有办法解决这个问题。命令形式的工作方式是将每个参数转换为字符串。当您执行save weights.txt weights
时,这会被解释为save ("weights.txt", "weights")
,当您执行save filename weights
时,它与save ("filename", "weights")
相同,因此它会保存在名为filename的文件中。为什么你必须在字符串中传递变量名而不是变量本身?想象一下,您尝试保存的变量是一个字符串。 save
如何知道它是否应该保存字符串或名为字符串的变量?
使用-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的方法吗?