如何将方程式作为字符串?

时间:2017-12-16 16:40:33

标签: octave equation

我有一个等式用于制作等值面,然后将其保存到文件中,我需要跟踪哪些等式属于哪个文件。因此,我想将我的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的表达式是生成文件的等式(与代码中的相同)。必须在文件名字符串中删除或替换无效的字符。

没有在线资源似乎提到打印方程式;只打印数字或求解方程式。

1 个答案:

答案 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的更多信息。