我有一个方程,用来做一个等距面,然后保存到一个文件中,我需要跟踪哪个方程属于哪个文件。因此,我想给我的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的表达式是生成文件的等式(与代码中的相同)。无效字符必须在文件名字符串中删除或替换。
没有任何在线资源似乎提到打印一个等式;只有打印数字或求解方程。
发布于 2017-12-16 22:11:32
您可以这样做的一种方法是使用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()使用regex替换来用下划线替换“不想要的”字符。当然,您可以进行更精细的操作,例如将*更改为_TIMES_或任何您喜欢的操作。有关操纵字符串这里的更多信息。
https://stackoverflow.com/questions/47847840
复制相似问题