手習ひデジタル信号処理(71) Scilab、整数型と実数型間の変換、そんなことも知らずに

Joseph Halfmoon

前回画像データを扱って驚愕したのは、Scilabの整数型から実数型への変換方法を知らなかった、という間抜けぶりです。慌てふたき無理やりな変換で誤魔化しました。今回はこの基本的な部分をちゃんと調べておきたいと思います。といって調べりゃ分かるのよ。ついでに変数のタイプをわかりやすい?文字列で出力する関数も作ってみました。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。

Scilabは、a = 1;とか入力すれば、何も言わずに倍精度の実数型にしてくれる処理系です。有無をいわさず実数型で処理が進むので、今まで何も問題なかったデス。ところが前回画像データを扱って気づいたのは、画像データがR、G、B各8ビットの整数だったりすること。そして、整数にテキトーな実数を演算しても整数が返ってくるという事実であります。整数型と実数型を行き来する方法が知りたいデス。

変数型の確認用の関数を作ってみた

調べてみたらば、整数、実数間の変換方法は極めて簡単でした。そこでオマケということで変数の型を判別して文字列表示する関数をこさえてみました。変数型を判定する関数はもともとScilabに組み込まれているのですが、素っ気ない数字を返してくれる関数なので、忘却力の年寄は「ポロっと数字言われてもなあ、知らんよなあ」という感じっす。まあその数字を文字列にしただけのこと。

参照させていただいたのは、いつもお世話になっております、Scilab Online Helpの以下のページ(リンクは日本語ページ)です。

type

上記のtype関数は、引数に与えた変数の型を識別し、数値で型を返すものです。ただし、整数型はひとまとめにまとめて整数と識別です。

inttype

上記のinttype関数は、整数型の変数を渡すと1から18の数字を返してきます。10進一桁の返り値であれば符合付整数型のバイト数、2桁であれば1桁目が符合無整数型のバイト数です。

上記の関数に「一皮かぶせた」自前の関数 dispType.sci が以下に。

// Display object type
// arg: object
function dispType(arg)
    select type(arg)
    case 1
        disp("decimal or complex numbers");
    case 2
        disp("with real or complex coefficients");
    case 4
        disp("booleans");
    case 5
        disp("sparse matrix");
    case 6
        disp("boolean sparse matrix");
    case 7
        disp("Matlab sparse matrix");
    case 8
        itype = inttype(arg);
        if itype > 10
            mprintf("unsigned integer, %d byte[s]\n", (itype - 10));
        else
            mprintf("signed integer, %d byte[s]\n", itype);
        end
    case 9
        disp("graphic handles");
    case 10
        disp("text objects");
    case 13
        disp("a compiled function in Scilab code");
    case 14
        disp("library of compiled Scilab functions");
    case 15
        disp("list")
    case 16
        disp("typed list");
    case 17
        disp("matrix-oriented typed list");
    case 128
        disp("an ID of a Xcos block, etc.");
    case 129
        disp("a size implicit polynomial used for indexing");
    case 130
        disp("C/Fortran code");
    case 0
        disp("An undefined element of a list");
    else
        disp("Unknown");
    end
endfunction

ちゃんと全部のケースをテストしてないので、ヤバイんですけど。

整数型「からの」「への」変換関数

整数型から実数への変換はそのものズバリでした。double()関数とな。

    • double

何も言わずに倍精度の浮動小数点数にしてくれるScilabなので、doubleだよな。なんで気づかなかったんだろ~。おお間抜け。

一方実数から整数への変換は、変換先の整数のビット幅と符合の有無に応じて8種類ありました。以下のとおり。

    • int8 1
    • int16 2
    • int32 4
    • int64 8
    • uint8 11
    • uint16 12
    • uint32 14
    • uint64 18

int8のよこに1などと書いてあるのは、int8型の整数変数をinttype()関数で判定したときに返ってくる数値であり、なおかつ、以下のiconvert()関数で実数を整数型に変換するときに使う数値でもあります。

以下のiconvert()は、第1引数に実数値(変数)を、第2引数に上記の数値を与えると上の関数8個のどれかと等価な変換を行ってくれる関数デス。

    • iconvert

この、同じことをやるのにいくつも関数がある、というのはScilabの流儀ですな。

変換例

さて、上記を踏まえて、変換と変数型判定の実践であります。まずは実数型変数a を定義して、2つの方法で整数型に変換してみます。

toINTEGERS

型判定の結果、期待どおりよのう。大丈夫?

つづいて逆方向、整数型の変数から実数へ。fromINTEGERS

実数に戻りましたな。ただし、整数型に変換する関数は、変換時に「小数点以下を切り捨て」てくれるみたいです。上記では1.23でしたが、1.56とかにしても余計なお世話で四捨五入してくれるようなことはありません、切り捨て。

このくらい、調べておいてから使えよな Scilab。次回こそ信号処理っぽいことに戻りたいデス。

手習ひデジタル信号処理(70) Scilab、わざわざconv2でソーベルフィルタをかけてみる へ戻る

手習ひデジタル信号処理(72) Scilab、画像用のフィルタ関数を使ってみる へ進む