From 71559f3e2498051b9205242defdf994e30838c75 Mon Sep 17 00:00:00 2001 From: wyq Date: Tue, 8 Apr 2025 09:02:24 +0800 Subject: [PATCH] add toeplitz function --- meteoinfo-lab/milconfig.xml | 16 ++-- .../pylib/mipylib/numeric/core/_ndarray.py | 4 +- .../mipylib/numeric/linalg/__init__$py.class | Bin 2177 -> 2734 bytes .../pylib/mipylib/numeric/linalg/__init__.py | 7 +- .../numeric/linalg/_special_matrices.py | 76 ++++++++++++++++++ .../org/meteoinfo/ndarray/math/ArrayUtil.java | 25 ++++++ 6 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 meteoinfo-lab/pylib/mipylib/numeric/linalg/_special_matrices.py diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 664636d2..e810f28e 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,34 +1,32 @@ - - + - - - + + + + - - + - - + diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py index 6f6fcb63..db84cc85 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py @@ -765,7 +765,7 @@ class NDArray(object): else: ArrayMath.setImage(self._array, val) - def conj(self): + def conjugate(self): """ Return the complex conjugate, element-wise. @@ -775,6 +775,8 @@ class NDArray(object): """ return self.array_wrap(ArrayMath.conj(self._array)) + conj = conjugate + def min(self, axis=None): """ Get minimum value along an axis. diff --git a/meteoinfo-lab/pylib/mipylib/numeric/linalg/__init__$py.class b/meteoinfo-lab/pylib/mipylib/numeric/linalg/__init__$py.class index f273ffda73029b450873e134e6b882eb206457ca..a74e6d2a4d6989d5662b6e6c3b808790d64b4881 100644 GIT binary patch delta 1003 zcmZuuYflqV5Ixgv>2_HnU4ft|peSGq6h%=HpB0riqM(Sfu4RF0OQBti^@YYy#>Cj% z_$y2dk60Rs`~VX__$y5O2_~X*X-zb7KkS^DIrrQ%bD#U)musIlKW+dxgy+kei$Z=g zHD^bnR?LiBPBI#?Q!4y~ibQfcG?#W}60@O5B58+)(tXjC;}x~E%ddCE=bZH5ox66# zNfD~XGrc>-1eGh*jS|)!7}ZgQT^h=;o8UD~D;6_N6*UAkWjnD%#L9dLWG1{jBy$h; zYH*{DnbWp2YsGCsOXlnLOixvbj{T^Y-3CHsrmwQWivxsW(`2UQI7!pg5tNJong|{< zYE4cO+8fygAK$B^1tHmNW$`I9W~H1cfx2}bzs<+8heZd~tL-@ILj{hBdFu3^ASjLb z2~KM0#3`{s;o@^T&fu&MVVoDbt99E&9;Gv$m|Te2r&M%{Ue|l07kwJb^y?s8kkmm@ ztaO+2(JFLkob#}kF)Yz_5mjpFhIpxrsyA^5eO5%!*l04b6$yo?-Rvk2hsgglduTl#8F9SM*T4EE-u1vu(mWTu`NJe(g$W ziDMB*;yU3mXYZi!4uBUycNVIl1>HH620aoRdF*Apj|8_jK+vdd&SD=81XXTu zmPI2MH4YLtH=9`;99S&Sf~7@&vy6XPe@LzmII@D{OYDR2g#Q)rY+v2yp|7>unTNsi^~>`a1QsD*cyL?7~+y3 zzI*HE6HAmI@F}<2;rhid;`Sm;UKt)iVVsA*p@G-p=cED=)bH>K1k@>G`?Or!~-yQk!!6&V}t=uj0gap9Lbi~~ZqEIfa`xinyh|Mk~U{9hJ5+G^<9e zS^1%JeSe?OuEs1+ty`bzi7LpsHJ`^O+=BtBr{+_%=#dzsjKp!mGye5K@B_TS+=g`R zzzh)&jBiNRkg9TmP;QDeC%s2gn#bX~G@IK&XKo9pg!qo!bZ_AHiZvl>93T>jI70Mq zA-~Bs+Je__8pIiiV`dF`-3o}|0tTAd4mQ`>>> from scipy.linalg import toeplitz + >>> toeplitz([1,2,3], [1,4,5,6]) + array([[1, 4, 5, 6], + [2, 1, 4, 5], + [3, 2, 1, 4]]) + >>> toeplitz([1.0, 2+3j, 4-1j]) + array([[ 1.+0.j, 2.-3.j, 4.+1.j], + [ 2.+3.j, 1.+0.j, 2.-3.j], + [ 4.-1.j, 2.+3.j, 1.+0.j]]) + + """ + c = np.asarray(c) + if r is None: + r = c.conjugate() + else: + r = np.asarray(r) + + ta = ArrayUtil.toeplitz(c._array, r._array) + + return np.NDArray(ta) diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java index 0cada629..073fc5a8 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java @@ -1426,6 +1426,31 @@ public class ArrayUtil { return Array.factory(DataType.INT, new int[]{n, n}, M); } + /** + * Returns a Toeplitz matrix in which each descending diagonal + * from left to right is constant. + * + * @param col First column of the matrix. {@code A[i, j] = kl[i - j]} for {@code i > j} + * @param row First row of the matrix. {@code A[i, j] = ku[j - i]} for {@code i <= j} + * @return the Toeplitz matrix. + */ + public static Array toeplitz(Array col, Array row) { + int nx = (int) row.getSize(); + int ny = (int) col.getSize(); + DataType dataType = ArrayMath.commonType(col.getDataType(), row.getDataType()); + Array r = Array.factory(dataType, new int[]{ny, nx}); + for (int i = 0; i < ny; i++) { + for (int j = 0; j < i; j++) { + r.setObject(i * nx + j, col.getObject(i - j)); + } + for (int j = i; j < nx; j++) { + r.setObject(i * nx + j, row.getObject(j - i)); + } + } + + return r; + } + /** * Repeat a value n times *