21

このテーマに関するOctaveのドキュメントは、威圧的でまばらです。

見つけた解決策を他にどこに文書化するかわからなかったので、ここに投稿します。それが不適切な場合はお詫びしますが、次の人を助けたいと思います。

次の解決策は、配布可能な単純なウィンドウ用です。

ユースケース:
ソリューションはOctave 3.2.4で開発されており、コンピュータースキルがほとんどないエンドユーザーに配布する必要があります。Octaveのインストールと説明は不可能です。解決策は、「ワンクリック」または「脳死」でなければなりません。

既知の問題:
file_in_path.mが間違っているため、3.2.4でimreadが失敗します。ファイルfile_in_path.mを次のように更新する必要があります(置き換えるだけです)。

function name=file_in_path(p,file)
  idx=[1 findstr(p,pathsep) length(p)+1];
  for i=1:length(idx)-1
    if idx(i+1)-idx(i)<=1
      dir=strcat(pwd,"/");
    else
      dir=p(idx(i)+1:idx(i+1)-1);
    end
    name = fullfile(dir, file);
    fid = fopen(name,"r");
    if fid >= 0
      fclose(fid);
      return
    end
  end
  fid = fopen(file,"r");
  if fid >= 0,
    fclose(fid);
    name=file;
    return
  end
  name=[]; 
4

7 に答える 7

11

解決策: mkoctfile を使用して配布可能な exe を作成し、この exe をコア Octave ファイル、および必要に応じて他の .oct および .m ファイルと共にパッケージ化します。

ステップ 1: スタンドアロンの実行可能ファイルを作成します。

ここで動作するコードを確認できます: http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html

特に「embedded.cc」というファイル。

そのファイルを次のように簡略化しました。

#include <iostream>
#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/parse.h>

int
main (int argc, char *argvc[])
{
  string_vector argv (2);
  argv(0) = "embedded";
  argv(1) = "-q";

  octave_main (2, argv.c_str_vec(), 1);

  octave_value_list in = octave_value (argvc[1]);
  octave_value_list out = feval ("your_custom_m_file", in);

  if (!error_state && out.length () > 0)
    {
    }
    else
    {
        std::cout << "invalid\n";
    }

  return 0;
}

コマンドでこのファイルをビルドします

mkoctfile --link-stand-alone embedded.cc -o embedded

警告がスローされる場合がありますが、エラーがスローされない限り問題ありません。embedded.exe ファイルがビルドされ、実行できるようになります。唯一の問題は、オクターブを素晴らしいものにするすべての利点が欠けていることです。それらを提供する必要があります。

ステップ 2: 配布フォルダーを作成する

多くの Octave ファイルのコピーを作成する必要があります。これ専用のディレクトリをお勧めします。少なくとも、\bin 内のすべてまたはほとんどの DLL のコピーが必要です。さらに、配布可能な実行可能ファイルをこのディレクトリに配置します。

ステップ 3: その他のファイルもぐらたたき

ここで、.m スクリプトを実行するために必要な他のファイルを見つける必要があります。\oct\i686-pc-mingw32*.oct と \share\octave\3.2.4\m\*\*.m を配布ディレクトリにコピーすることで、この手順を簡素化できます。もぐらたたきステップを防ぎます。

さて、あなたはもぐらたたきをするか、「私の仲間はどこにいるの?」という昔ながらの伝統を演じなければなりません。

  1. コマンド プロンプトを開き、配布フォルダーに移動します。
  2. 有用な PATH 文字列をすべて取り除きます。あなたの顧客はそれらを持っていません。
  3. プログラム embedded.exe の実行を試みます。次のようなエラーが表示されます。

    embedded.exe
    エラー: 行 83 列 22 付近の「max」未定義
    エラー: 引数リスト要素番号 1 を
    評価中 エラー: 引数リスト要素番号 1 を評価中
    エラー: 呼び出し元:
    エラー: T:\sms\Development\research\c2\disttest\ strcat.m 行 83、列 3
    エラー: T:\sms\Development\research\c2\disttest\file_in_path.m 行 5、列 10
    エラー: T:\sms\Development\research\c2\disttest\imread。 50 行目、6 列目の m

  4. Octave インストールで「 max」を検索します。.oct または .m ファイルのいずれかになります。この場合、.oct ファイル max.oct です。これを配布ディレクトリにコピーします。

    B「min」などの明白なものを検索しても、結果が得られない。これは、Loadable Function「min」が .oct ファイル「max.oct」にあるためです。max.oct のコピーを作成し、名前を min.oct に変更します。今すぐ機能します。関数がどこにあるかをどのように知ることができますか? わからない。それらのほとんどは、min の場合は「max.oct」、「ifft2.oct」の場合は「fft2.oct」など、わかりやすい場所にあります。頑張ってください。

  5. 実行可能ファイルが実行されるまで繰り返します。

于 2012-08-19T08:25:10.733 に答える
5

m関数の代わりにスクリプトを実行する場合は、embedded.ccの行を追加します。

octave_value_list out = feval ("your_custom_m_file", in);

する必要があります:

octave_value_list out = feval ("your_custom_m_script");

また、'which'を使用して、不足している関数がパックされている場所を見つけます。たとえば、min関数の場合:

octave:22> which min

minファイルC:\ Octave \ Octave3.6.2_gcc4.6.2 \ lib \ octave \ 3.6.2 \ oct \ i686-pc-mingw32\max.octの関数です。

于 2013-01-09T15:11:49.100 に答える
1

上記のブレット 4 B のソリューションでは、次のようになります。

B 「min」などの明白なものを検索しても、結果が得られない。これは、Loadable Function「min」が .oct ファイル「max.oct」にあるためです。max.oct のコピーを作成し、名前を min.oct に変更します。今すぐ機能します。

一部の関数が @folder function.m から呼び出されている場合、これは機能しない可能性があります。また、不要な重複ファイルを避けるために、@folder の外の m ファイルのどこかに次のコードを追加するだけです。

autoload ("min", "max.oct");

同様に、次の方法で削除できます

autoload ("min", "max.oct", "remove");

max.oct へのパスがここに指定されていることを確認してください。

上記の理解は、\Octave-4.0.1\lib\octave\packages\communications-1.2.1\i686-w64-mingw32-api-v50+\ にある通信パッケージのファイル PKG_ADD および PKG_DEL に基づいています。

于 2016-03-31T13:52:20.017 に答える
1

走るmkoctfile --link-stand-alone embedded.cc -o embedded

バッチファイルからではなく、オクターブソリューションから。

半日節約できました(-;

于 2015-09-03T15:16:17.323 に答える