2017-12-16 20 views
0

私は、ファイルに保存された等値面を作るために使用される方程式を持っており、どの方程式がどのファイルに属しているかを追跡する必要があります。したがって、私は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を含む式は、コードと同じ(ファイルを生成する式であるcos(x) . sin(y) + cos(y) . sin(z) + cos(z) . sin(x) 1513441860368.objのような名前を持つ必要があります)。無効な文字は、ファイル名文字列で削除または置換する必要があります。

オンラインリソースでは、式を印刷するとは言えません。数字を印刷するか方程式を解くだけです。あなたがこれを行うことができます

+0

多分私は無効な文字を置き換えることができますか?要点は、Octaveに式の文字列表現を与えることができないということです。 – douira

+2

私はファイル名として数式を保存するのは良い考えではないと思います。数式を使って保存したファイルに文字列を追加したいと考えています。 – Andy

+0

Andyが言ったこと。または、実際に必要なものが関数を式に関連付ける方法であれば、単にプログラムで参照できる外部テーブルを作成するだけです。例えば。 'Equations.f1 =" cos(x) "; Equations.f2 = "sin(x)";など。 –

答えて

0

一つの方法は、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) 

あなたが見ることができるように、上記のコードは、関数fの表現を含む文字列eqnを作成します。 その後、文字列を操作して、ファイル名としてより合理的なものを得ることができます。ここでは簡単な例を示します。

ここ strjoin(strsplit(str), '')
> fname = regexprep(strjoin(strsplit(eqn(11:end)), ''), '[().*+]', '_') 
fname = cos_x___sin_y__cos_y___sin_z__cos_z___sin_x_ 

は、文字列strからすべての空白を削除します。関数regexprep()は正規表現置換を使用して「望ましくない」文字をアンダースコアに置き換えます。 もちろん、*から_TIMES_に変更するなど、もっと複雑な操作を行うこともできます。 文字列操作の詳細here

+0

これは私が探していたものです。ありがとう – douira

関連する問題