3

質問

デスクトップや Java なしで起動した MATLAB ウィンドウのコマンド ウィンドウ タイトルをどのように設定しますか?

  • 主な対象の Matlab バージョン: 2012a 以降
  • 必要な OS: 主に Windows (XP)。より一般的な優先事項
  • 理想的な解決策: 以下で説明する「mat」関数によって生成される結果のウィンドウにタイトルを設定します。
  • 別の解決策: 以下で説明する「matj」関数によって生成されるウィンドウにコマンド ウィンドウのタイトルを設定します。

バックグラウンド

「ベアボーン MATLAB」ウィンドウを起動する匿名関数があります (それぞれがメイン MATLAB ウィンドウのターミナルから実行されます。

mat  = @(sCmd) system(['matlab.exe -nodesktop -nosplash -nojvm -r "' sCmd ';" &']);
matj = @(sCmd) system(['matlab.exe -nodesktop -nosplash -r "' sCmd ';" &']);

「matj」ウィンドウは、「mat」によって生成されるウィンドウよりも RAM メモリを集中的に使用します。

私は、次のようなJava対応のウィンドウでタイトルを設定するテクニックを知っています(不思議なことに、「matj」ウィンドウでは機能しませんでした):

cmdtitle = @(sT) com.mathworks.mde.desk.MLDesktop.getInstance.getClient('Command Window').getTopLevelAncestor.setTitle(sT)

なぜこれが必要なのか/これで何をしているのか

私は、「マスター」MATLAB ウィンドウ (java およびその他のベル/ホイッスルが完全にロードされている) から、メモリ集約型の非プロット MATLAB タスクをこれらのベアボーン ウィンドウに分割します。タイトルをこれらに設定すると、そのウィンドウに割り当てられたタスクに関する視覚的なタグを付けることができます。

また、これらの最小限のウィンドウで表示されるテキスト バッファを拡張できると便利です (私のコンピュータでは 500 行までに制限されているようです)。タイトル設定の問題の回避策は、ベアボーン ウィンドウが表示されたら端末に文字列を表示することですが、バッファが制限されているため、最初の行が保持されません。

これらの目的を達成するためのより良い/代替方法に関する提案は、読んだり回答したりする時間と同様に、非常に高く評価されます. ありがとう&こんばんは。

4

1 に答える 1

2

その音によって、バッチ処理に似た何かを行っています。Matlab Parallel Computing Toolboxを調べてみてください。この & Matlab の最近のバージョンでは、コンピューターをミニ コンピューティング クラスターとして扱い、問題をきちんと解決できるバッチ ジョブを起動することができます。

または、ライセンスを取得していない場合は、windows api ルートを使用してウィンドウ タイトルを設定し、それを mexFunction でラップすることができます。興味深いので、これを行うためにいくつかのコードをハックしました。

//Include the windows api functions
#include <Windows.h>
//include the matlab mex function stuff
#include "mex.h"

DWORD processID; //the process id of the current matlab

//Callback function, this is the bit that sets the window text
BOOL CALLBACK SetTitleEnum( HWND hwnd, LPARAM lParam ) {    
    DWORD dwID ;
    //get the process of the window this was called on
    GetWindowThreadProcessId(hwnd, &dwID); 
    //if it is our matlab instance, set the title text
    if(dwID == processID) SetWindowText(hwnd, (const char*) lParam);
    return true;
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{
    //get the process id of this instance of matlab
    processID = GetCurrentProcessId(); 

    if (nrhs > 0) { //if we have been given a title
        char * title = mxArrayToString(prhs[0]); //get it as a char* string     
        //get all open windows and call the SetTitleEnum function on them
        EnumWindows((WNDENUMPROC)SetTitleEnum, (LPARAM) title);        
        mxFree(title);//free the title string.
    }
}

上記のコードを Visual Studio 2010 Express を使用して Matlab でコンパイルしたところ、制限付きのコマンド ライン バージョンと通常のフル デスクトップ Matlab の両方で問題なく動作しました。

于 2013-04-18T21:09:49.793 に答える