もちっとメモ

もちっとメモ

もぐりのエンジニアが日々の中で試してみたことを気が向いたときに書き連ねていきます

2016年 個人的注目のアドベントカレンダー(年内随時更新)

お恥ずかしながら最近アドベントカレンダーなるものの存在を知りました。そこで、個人的に何と無く気になっている、読んでみようかなと思っているアドベントカレンダーをつらつらと書きます。基本的には自分への備忘録です。それでもよろしければどうぞ。adventar.org

adventar.org

adventar.org

adventar.org

adventar.org

adventar.org

 

Texでスライドを作る

Texでスライドを作る
目次や現在位置を簡単に表示させられるし,数式はきれいに作れるから一度試してみたい.
でも,パワーポイントみたいに直感的に作れなさそうなのでめんどくさいかも.
参考サイト
プレゼンテーション用 LaTeX クラス Beamer の使い方メモ

テンプレートLaTeX チートシート (作成途中)


追記:2016/12/22
実際に作ってみました.
テンプレシート+\usepackage{beamerthemeshadow}で思っていた通りのスライドができました.
確かに出来はかっこいい.数式も美しい.Tex感覚で入力もできる.
でも,動画埋め込めないよね?逐次文字サイズを調節するのは面倒.レイアウトの柔軟さがない?
勉強すればいいものが作れるかもしれないけど,慣れるまでは時間がかかりそう.

 

ベクトル場を書いて分岐現象を見たい

ホップ分岐やサドル・ノード分岐など分岐現象を可視化する方法として方程式のベクトル場を見ることがあります.
以下はサンプルコードです.
C++コード

    
    
      #define _USE_MATH_DEFINES
      #include <math.h>
      #include <fstream>
      #include <iostream>
      #include <thread>
      #include <vector>
      const double Delta=0;
      const double deltaOmega=1;
      const double Omega1=1;
      const double Omega2=Omega1+2*deltaOmega;
      const double strength=1;
      const double p=1;
      //x軸(極座標なら動径)方向の微分方程式
      float funcx(float x, float y){
       return (-Delta + strength / 2.0*(1 - p)*(1 - x*x))*x + strength*p*(x*(1 - x*x) / 2.0)*cos(y);
       }
      //y軸(極座標なら偏角)方向の微分方程式
      float funcy(float x, float y){
       return fabs(Omega2 - Omega1) - strength*p*(1 + x*x)*sin(y);
      }
      //ベクトル場の出力
      void vector_field(){
       double beginx=0; //x軸の最小値(極座標なら動径)
       double endx=1; //x軸の最大値
       double beginy=0; //y軸の最小値(極座標なら偏角)
       double endy = 2.0*M_PI; //y軸の最大値
       double step=0.1; //ベクトル場のステップ幅
       float x, y, deltax, deltay, norm; //変数
       char filename[100];
       sprintf(filename, "vector_field.dat");
       ofstream output(filename); //ファイル出力
       for (x = (beginx-step); x <= (endx+step); x = x + step){
        for (y = beginy; y <= endy; y = y + step){
         norm = sqrt(funcx(x, y) * funcx(x, y) + funcy(x, y)*funcy(x, y));
         deltax = funcx(x, y) / (1.0 + norm)*step;
         deltay = funcy(x, y) / (1.0 + norm)*step;
         output << y << " " << x << " " << deltay/step << " " << deltax/step << endl;
        }
       }
    output.close();
    }
    int main(){
     vector_field();
     return 0
    }
    

Gnuplotコード

    
      set isosamples 200,300
      set term pngcairo enhanced size 640,480
      set polar
      set grid polar
      set size square
      set xrange [-1.1:1.1]
      set yrange [-1.1:1.1]
      set key outside top center reverse Left
      set o sprintf("vector_field.3f.png")
      plot \
      sprintf("vector_field-p%.3f-w%.3f-d%.3f.dat",p,i*a,d) with vector,
    

参考サイト

gnuplotで二次元のベクトル場を綺麗に書く。ただしベクトル場はファイルから読み込む。poissondd.wordpress.com

C++で文字列⇔数字の変換

友人に聞かれて10桁の数字の列を逆ピラミッド式に足していったときに最後に得られる数字の1桁目を答えるという問題を解いてみました.
http://1fxfx.jugem.jp/?eid=190&guid=ON&view=mobile&tid=1 ←こんな感じの

そのときに始めに与えられる数字が0から始まる際はどうしてもint型などの数字では扱えず文字列として入力して,計算するときに数字に変換する必要がありました.
具体的には
・string型⇔int型
・char型⇔int型
です.
string→intは便利な関数があるみたいですね.
【C++】string型を数値型に変換する方法【string to int/double等々】 | MaryCore

問題はchar→intでした.
このchar型というのはASCIIコードに基づいて文字を数字と対応づけています.
ASCII文字コード : IT用語辞典
そのため,単純にint型にキャストすると,以下のような場合,

    
        char hoge = "0";
        int ans = (int)hoge + 2;
        printf("%d",ans);
    

50という出力が返ってきます.
これは,'0'はASCIIコードでは48に対応しているためです.
そこで,char→intで変換するときは,基準を'0'までずらせばいいわけです.つまり,

    
        char hoge = "0";
        int ans = (int)(hoge - '0' ) + 2;
        printf("%d",ans);
    

とすれば,ちゃんと2という出力が返ってきます.
これに気付くまで1時間はかかりました.知ってれば一瞬なんでしょうけど,独学だときづくまでに時間がかかりますね.

おまけ:
冒頭の問題を解くときにもう一つ必要だった課題解決.

Texだけを用いて複雑な表を書く

基本的にはセルの結合を駆使して作成する.

行方向の結合は\multicolumn{結合セル数}{|c|}{文字}
列方向の結合は\multirow{結合セル数}{フォントサイズ(指定しないときは*)}{文字列}
あとは下記のサイトを参考に適宜線を太くしたりして調節する.
よく使うのは\clineや\hline.
今回は\rotateboxも使った.
場合によってはプリアンブルに
\usepackage{array}
を加えておくのもよいかも.

以下サンプルコードです.


        \documentclass[4apaper]{jsarticle}
        \usepackage{multirow,array}
        \usepackage[dvipdfmx]{graphicx}
        \newlength\savedwidth
        \newcommand{\wcline}[1]{\noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 2pt} \cline{#1}
        \noalign{\global\arrayrulewidth\savedwidth}}
        \newcolumntype{I}{!{\vrule width 2pt}}
        
        \begin{document}
        
        \begin{table}[t!]
        \centering
        \caption{テスト} \label{tab:matrix}
        \begin{tabular}{|c|c|l|l|}
        \hline
         &\multicolumn{3}{c|}{軸1} \\
         \cline{1-4}
           \multicolumn{1}{|c|}{\multirow{16}*{\rotatebox[origin=c]{90}{軸2}}} && \multicolumn{1}{c|}{要素1} & \multicolumn{1}{c|}{要素2} \\
           \cline{2-2}\wcline{3-4}
             &\multirow{8}{*}{要素3} & \multicolumn{1}{Il|}{データ 2016/12/01} & \multicolumn{1}{lI}{データ 2016/12/02} \\
              & & \multicolumn{1}{Il|}{ データ 2016/12/03} &\multicolumn{1}{lI}{データ 2016/12/04}\\
              & & \multicolumn{1}{Il|}{データ 2016/12/05} & \multicolumn{1}{lI}{{\bf データ 2016/12/06}} \\
              & & \multicolumn{1}{Il|}{データ 2016/12/07} & \multicolumn{1}{lI}{ データ 2016/12/08}\\
              & & \multicolumn{1}{Il|}{データ 2016/12/09} & \multicolumn{1}{cI}{}\\
              & & \multicolumn{1}{Il|}{データ 2016/12/10} & \multicolumn{1}{cI}{}\\
              & & \multicolumn{1}{Il|}{\bf データ 2016/12/11} & \multicolumn{1}{cI}{}\\
              & & \multicolumn{1}{Il|}{データ 2016/12/12} & \multicolumn{1}{cI}{}\\
            \cline{2-4}
             &\multirow{4}{*}{要素4} & \multicolumn{1}{Il|}{データ 2016/12/13} & \multicolumn{1}{lI}{{\bf データ 2016/12/14}}\\
              & & \multicolumn{1}{Il|}{データ 2016/12/15} & \multicolumn{1}{lI}{データ 2016/12/16}\\
              & & \multicolumn{1}{Il|}{\bf データ 2016/12/17} &\multicolumn{1}{lI}{}\\
              & & \multicolumn{1}{Il|}{データ 2016/12/18} &\multicolumn{1}{cI}{}\\
            \cline{2-2}\wcline{3-4}
             &\multirow{2}*{要素5} & データ 2016/12/19 & \multicolumn{1}{l|}{データ 2016/12/20 }\\
              && データ 2016/12/21 & \multicolumn{1}{l|}{データ 2016/12/22}\\
            \cline{2-4}
             &\multirow{2}*{要素6} & データ 2016/12/23 & データ 2016/12/24 \\
              && データ 2016/12/25 & データ 2016/12/26\\
            \hline
        \end{tabular}
        \end{table}
        \end{document}
    

出力結果

f:id:T-N-Clark:20170220155040p:plain

 

参考サイト

LaTeX 表の書き方
(LaTex) 表の罫線を太くする方法 - その時々
tabular環境の中で行を縦に結合[LaTeX]