« スマホRF駆け出しエンジニアの豆知識: 番外編:ミリ波AiP(Qualcomm QTM545)のパッチアンテナにマジックで印をつけるのやめろ!(Samsung Galaxy S22のiFixit分解みて)そしてミリ波でもロスがない魔法ののりプリット。 | トップページ | 松のやでわらじかつ丼(かつ2枚丼&ご飯大盛)をいただく。かつが大きいのはもちろんだが、刻み柚子が非常にいいアクセントになってる。 »

2022年3月21日 (月)

ExcelでLAMBDA関数が使えるようになった(12) VBAを使わずに複素行列の積、逆行列などをLET, MAKEARRAY, INDEXと実行列のMMULT, MINVERSEなどを組み合わせて実現する(IMMULT, IMINVERSE)

Excelでは行列の積や逆行列が計算できる(MMULT, MINVERSE)。そして複素数も計算できる(IMSUM, IMPRODUCTなど)。

しかし複素行列が扱えない。LAMBDAが使えるようになったのでMAKEARRAYやINDEXを組み合わせてやってみよう。

こんな感じです。

Lambda_complex_mat_formula1
Lambda_complex_mat_formula2
Lambda_complex_mat_formula3
テキストでも書いておくと、まず複素数の行列を実部と虚部に分ける関数を作ってから積、逆行列の関数を定義してます。
RealMat = LAMBDA(A, 
            LET(r, ROWS(A),
                c, COLUMNS(A),
                MAKEARRAY(r,c,
                LAMBDA(r, c, 
                IMREAL(index(A, r,c))
                )
            )
        )
    );

ImagMat = LAMBDA(A, 
            LET(r, ROWS(A),
                c, COLUMNS(A),
                MAKEARRAY(r,c,
                LAMBDA(r, c, 
                IMAGINARY(index(A, r,c))
                )
            )
        )
    );

IMMULT = LAMBDA(A, B, 
          LET(Ar, RealMat(A), 
              Ai, ImagMat(A), 
              Br, RealMat(B),
              Bi, ImagMat(B),
              Cr, MMULT(Ar, Br)-MMULT(Ai,Bi),
              Ci, MMULT(Ar,Bi)+MMULT(Ai, Br),
              r, ROWS(A),
              c, COLUMNS(B),
              MAKEARRAY(r,c,
              LAMBDA(n,m,complex(index(Cr, n,m),index(ci,n,m))
              )
            )
        )
    );


IMINVERSE = LAMBDA(A, 
          LET(Ar, RealMat(A), 
              Ai, ImagMat(A), 
              Br,MINVERSE(Ar+MMULT(MMULT(Ai, MINVERSE(Ar)),Ai)),
              Bi, -MMULT(MMULT(MINVERSE(Ar),Ai),Br),
              r, ROWS(A),
              c, COLUMNS(A),
              MAKEARRAY(r,c, 
                LAMBDA(n,m, 
                    COMPLEX(index(Br, n,m),index(Bi,n,m))
                )
              )
            )
        );

IMMSUM = LAMBDA(A, B, 
          LET(Ar, RealMat(A), 
              Ai, ImagMat(A), 
              Br, RealMat(B),
              Bi, ImagMat(B),
              Cr, Ar+Br,
              Ci, Ai+Bi,
              r, ROWS(A),
              c, COLUMNS(B),
              MAKEARRAY(r,c,
                 LAMBDA(n,m,complex(index(Cr, n,m),index(ci,n,m)))
              )
            )
        );

IMMSUB = LAMBDA(A, B, 
          LET(Ar, RealMat(A), 
              Ai, ImagMat(A), 
              Br, RealMat(B),
              Bi, ImagMat(B),
              Cr, Ar-Br,
              Ci, Ai-Bi,
              r, ROWS(A),
              c, COLUMNS(B),
              MAKEARRAY(r,c,
                LAMBDA(n,m,complex(index(Cr, n,m),index(ci,n,m)))
                )
            )
        );
積を計算した事例:

Lambda_complex_mat1

逆行列を計算した事例:

Lambda_complex_mat2

 

一応Python(Numpy)であってるか確かめた。

C=np.array([[1+2j,3+4j,5+6j],[3+4j,1+2j,5+6j],[5+6j,3+4j, 1+2j]])

array([[1.+2.j, 3.+4.j, 5.+6.j],
       [3.+4.j, 1.+2.j, 5.+6.j],
       [5.+6.j, 3.+4.j, 1.+2.j]])
array([[-0.105     +0.09833333j,  0.08333333-0.08333333j,
         0.06166667-0.06833333j],
       [ 0.145     -0.15166667j, -0.16666667+0.16666667j,
         0.06166667-0.06833333j],
       [ 0.02      -0.02666667j,  0.08333333-0.08333333j,
-0.06333333+0.05666667j]])

よし、合ってる。
フーリエ変換、ルンゲクッタ、積分、複素行列の扱いまでできるようになったので
Excelだけで結構いろんな数値計算できるんじゃないだろうか。

VBAでやる場合はこちらも参照:


Excel VBAで複素数演算(一次方程式・FFT他, Numerical Recipes移植)、フィッティング(非線形含む)、ルンゲクッタ8次(DOP853)などが使えるライブラリ その1:複素数演算の基礎

過去にやったもの:

ExcelでLAMBDA関数が突然使えるようになった。4段4次のルンゲクッタ法がワークシートだけ(VBA使わずに)で簡単に計算できるようになった。まずはローレンツ方程式を計算してみる。

ExcelでLAMBDA関数が突然使えるようになった(2) 5次のルンゲクッタフェールベルグ法でローレンツ方程式をワークシートだけで(VBA使わずに)計算

ExcelでLAMBDA関数が突然使えるようになった(3) LET、SEQUENCE、IFSと組み合わせてワンライナー(1セル)で数値積分(シンプソンの積分公式)を計算

ExcelでLAMBDA関数が突然使えるようになった(4) LET、SEQUENCE、IFSと組み合わせてクロソイド曲線を計算するオリジナルの関数を作る。セルに=Clothoid_X(A2)とか入れるだけで計算できる。

ExcelでLAMBDA関数が突然使えるようになった(5)なんと再帰まで使える。階乗とフィボナッチ数列で試してみた。

ExcelでLAMBDA関数が使えるようになった(7) 離散フーリエ変換(DFT=Discrete Fourier Transform)(修正版)と逆変換(IDFT)をLAMBDA、LET、SEQUENCE、MAKEARRAY、MAP、複素数関数(IMEXP,IMPRODUCTなど)を組み合わせてVBAも分析ツールもなしに関数として実現する。

ExcelでLAMBDA関数が使えるようになった(8) 4段4次のルンゲクッタ法をLAMBDAだけ(VBAもセルの計算も使わずに)で実現、RK4(t, x, y, z)だけで次の時間ステップが計算できるようにした。例はもちろんローレンツ方程式。

ExcelでLAMBDA関数が使えるようになった(9)リーマン・ゼータ関数ζ(z)をLAMBDA、REDUCE、SEQUENCE、複素数関数を組み合わせて=Zeta(1/2+2i)などで計算できるようにした。

ExcelでLAMBDA関数が使えるようになった(10) Sパラメータのような複素数データの実部・虚部のRIとデシベル、位相のdBを2列を選択するだけで dB2RI(範囲), RI2dB(範囲)でLAMBDA, MAKEARRAY,LETを使って相互に計算できるようにする。

ExcelでLAMBDA関数が使えるようになった(9の追記)リーマン・ゼータ関数ζ(z)をLAMBDA、REDUCE、SEQUENCE、複素数関数を組み合わせて=Zeta(1/2+2i)などで計算できるようにしたので、それをMAP関数を使って3次元グラフにしてみる。

ExcelでLAMBDA関数が使えるようになった(11) 複数のセルの並びから1つ飛ばしとか2つ飛ばしとかでデータを取り出す関数PickOut(範囲、何行ずつか、何列ずつか)を作った。よく変なデータの並びで取り出すのがめっちゃ困ることがあるので。

« スマホRF駆け出しエンジニアの豆知識: 番外編:ミリ波AiP(Qualcomm QTM545)のパッチアンテナにマジックで印をつけるのやめろ!(Samsung Galaxy S22のiFixit分解みて)そしてミリ波でもロスがない魔法ののりプリット。 | トップページ | 松のやでわらじかつ丼(かつ2枚丼&ご飯大盛)をいただく。かつが大きいのはもちろんだが、刻み柚子が非常にいいアクセントになってる。 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« スマホRF駆け出しエンジニアの豆知識: 番外編:ミリ波AiP(Qualcomm QTM545)のパッチアンテナにマジックで印をつけるのやめろ!(Samsung Galaxy S22のiFixit分解みて)そしてミリ波でもロスがない魔法ののりプリット。 | トップページ | 松のやでわらじかつ丼(かつ2枚丼&ご飯大盛)をいただく。かつが大きいのはもちろんだが、刻み柚子が非常にいいアクセントになってる。 »

最近の記事

最近のコメント

2022年8月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
フォト
無料ブログはココログ