我有一个等式用于制作等值面,然后将其保存到文件中,我需要跟踪哪些等式属于哪个文件。因此,我想将我的Octave脚本生成的文件标记为产生它们的等式,而不是手动标记它们。 这是我现在的代码:
clf;
function [f, v] = doiso(dodraw)
m = 3;
dim = -m:0.1:m;
if (dodraw > 0)
dim = -m:0.6:m;
endif
[x,y,z] = meshgrid(dim, dim, dim);
func = cos(x) .* sin(y) + cos(y) .* sin(z) + cos(z) .* sin(x);
if (dodraw > 0)
isosurface(func, 0);
else
[f, v] = isosurface(func, 0);
endif
endfunction
#draw
doiso(1);
axis equal;
title("isosurface() of the function");
#saveq
[f, v] = doiso(0);
vertface2obj(v, f, strcat("objs/", int2str(time * 1000), "out.obj"));
保存的文件应具有cos(x) . sin(y) + cos(y) . sin(z) + cos(z) . sin(x) 1513441860368.obj
之类的名称,其中长号是时间戳,包含sin和cos的表达式是生成文件的等式(与代码中的相同)。必须在文件名字符串中删除或替换无效的字符。
没有在线资源似乎提到打印方程式;只打印数字或求解方程式。
答案 0 :(得分:1)
一种方法是使用func2str()
:
func2str (fcn_handle)
返回一个字符串,其中包含函数句柄
fcn_handle
引用的函数的名称。
您必须为等式创建一个匿名函数。例如,
> f = @(x,y,z) cos(x) .* sin(y) + cos(y) .* sin(z) + cos(z) .* sin(x);
> eqn = func2str(f);
> fprintf(stdout, '%s\n', eqn)
@(x, y, z) cos (x) .* sin (y) + cos (y) .* sin (z) + cos (z) .* sin (x)
如您所见,上面的代码创建了包含函数eqn
表达式的字符串f
。
然后,您可以操作字符串以获得更合理的文件名。这是一个简单的例子:
> fname = regexprep(strjoin(strsplit(eqn(11:end)), ''), '[().*+]', '_')
fname = cos_x___sin_y__cos_y___sin_z__cos_z___sin_x_
此处strjoin(strsplit(str), '')
会从字符串str
中删除所有空格。函数regexprep()
使用正则表达式替换来替换"不期望的"带下划线的字符。
您当然可以进行更精细的操作,例如将*
更改为_TIMES_
或您喜欢的任何内容。
有关操纵字符串here的更多信息。