13 Tips

必要があって調べたことでも、 忘れてしまって、後で「あれはどうだったかな?」が多い。 定着するまではメモが必要だ。

  • 自宅から大学のマシンにアクセスして長時間計算させるときは、 MATLAB を走らせるマシンにリモート・ログインして、 screen を起動し、その中で matlab -nodisplay で起動する。 当然グラフィックスは使わない。 後から screen -r とするわけだ。
  • size() は引数1個で読んだ場合、行列の行の個数、列の個数を返す。
      [m,n]=size(A);
    
      m=size(A,1);
      n=size(A,2);
    
      [n,dummy]=size(A);
    
  • 文字列リテラルを作る引用符が何故か single quotation mark である。
       s='Hello';
    
  • 文字列の連結は何か不思議なやり方で扱う。
      object='pen';
      str=['This ' 'is ' 'a ' object '.']
    
  • 数値の文字列への 変換は、num2str(), int2str() という関数を使う。 自分ではまだ使ったことがないが、sprintf() というのも便利かな?
  • 格子点の座標 ($ n$ 等分点) を作るときの決まり文句: x=a:(b-a)/n:b;
    (と思っていたのだけれど、linspace(a, b, n+1); とすべきかも)
  • 鳥瞰図は mesh(), 等高線は contour()
      x=a:(b-a)/nx:b;
      y=c:(d-c)/ny:d;
      u=zeros(ny+1,nx+1);
      ...
      mesh(x,y,u); または contour(x,y,u);
    
  • 鳥瞰図と等高線を並べる。ここはサンプル・プログラムを
    plot_n.m
    % plot_n.m --- 長方形領域上の問題の差分解の描画 (Neumann, free edge 境界条件)
    %
    % 使用例
    %  (1) Laplacian の第 n 固有関数
    %    [v,d]=eigs(eigp2nsp(nx,ny),10,0);
    %    plot_n(v(:,11-n),nx,ny);
    %  (2) 重 Laplacian の第 n 固有関数
    %    [v,d]=eigs(plate_f1(N,0.3),200,0); 小さい方から200個の固有値、固有関数
    %    plot_n(v(:,201-n),N,N);            (n=4 は正の最小固有値)
    
    function plot_n(v,nx,ny)
      % メモリー中に v[0][0],v[1][0],...,v[Nx][0],v[0][1],.. と並んでいる。
      % 2次元配列に収める
      vvv=zeros(nx+1,ny+1);
      vvv(:)=v;
      % 境界での値を修正する (角点では2倍することに注意)
      vvv(1,:)=vvv(1,:)*sqrt(2);
      vvv(nx+1,:)=vvv(nx+1,:)*sqrt(2);
      vvv(:,1)=vvv(:,1)*sqrt(2);
      vvv(:,ny+1)=vvv(:,ny+1)*sqrt(2);
      % mesh(), contour() には渡すには、vvは ny+1,nx+1 とする必要がある。
      vv=vvv';
      x=0:1/nx:1;
      y=0:1/ny:1;
    % 左側にグラフの鳥瞰図
      subplot(1,2,1);
      colormap hsv;
      mesh(x,y,vv);
    % 右側に等高線
      right=subplot(1,2,2);
      contour(x,y,vv);
      pbaspect(right,[1 1 1]);
      end
    
  • Mathematica に差分解を持って行く時のプログラム例。 MATLAB は大きいデータ問題ないが、 Mathematica では暴走したりするので (2012年現在)、 間引いている (i=1:N/160:N+1; として、 u=u(i,j); とすると、行数は 161 になる。)。
    % dividedata.m --- free_某_1280.mat を分割して poisson_某/u番号.dat
    % 2012/10/13 最初のバージョン (0,0.1,0.2,0.25,0.3,0.35,0.5で実行する)
    % 2012/11/17 小修正
    % written by Masashi Katsurada
    
    clear
    N=1280;
    i=1:N/160:N+1;
    j=1:N/160:N+1;
    muarray=[0 0.1 0.2 0.25 0.3 0.35 0.5];
    maxk=size(muarray,2);
    for k=1:maxk
      mu=muarray(k);
      mustr=num2str(mu);
      % mustr 0 0.1 0.2 0.25 0.3 0.35 0.5
      load(['free_' mustr '_1280.mat'])
      for n=1:200
        u=nv_to_dim2(v1280(:,201-n),N,N);
        u=u(i,j);
        save(['poisson_' mustr '/u' int2str(n) '.dat'], 'u', '-ascii')
      end
      e=diag(d1280);
      e=e(200:-1:1);
      save(['poisson_' mustr '/eigen.dat'],'e','-ascii')
    end
    
  • たくさんグラフィックスのウィンドウ (figure(某)) を出した時は, close(番号)close all で掃除する。
  • ライセンス番号が知りたいとき,
    >>> license
    ans =
    むにゃむにゃ
    
  • MATLAB を Mac にインストールして, Mac の OS を 10.8 にバージョン・アップすると, アクティベーションのやり直しが必要になる。 そのためにはディアクティベーションが必要で, 少し面倒である。 OS をバージョンアップする前にディアクティベーションをするのが簡単か。

桂田 祐史
2017-06-19