{"id":16985672,"url":"https://github.com/sinshu/numflat","last_synced_at":"2026-01-30T15:04:03.391Z","repository":{"id":219286050,"uuid":"748652539","full_name":"sinshu/numflat","owner":"sinshu","description":"A numerical computation library for C#","archived":false,"fork":false,"pushed_at":"2026-01-24T14:33:06.000Z","size":1379,"stargazers_count":40,"open_issues_count":8,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-25T02:27:20.255Z","etag":null,"topics":["clustering","dsp","fft","linear-algebra","math","matrix","multivariate-analysis","numerics","vector"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sinshu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-26T13:20:30.000Z","updated_at":"2026-01-24T14:33:10.000Z","dependencies_parsed_at":"2024-04-01T05:35:54.706Z","dependency_job_id":"6e3fe11e-35c2-4f20-b2a9-ae52dc26c8b1","html_url":"https://github.com/sinshu/numflat","commit_stats":null,"previous_names":["sinshu/numflat"],"tags_count":53,"template":false,"template_full_name":null,"purl":"pkg:github/sinshu/numflat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinshu%2Fnumflat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinshu%2Fnumflat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinshu%2Fnumflat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinshu%2Fnumflat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sinshu","download_url":"https://codeload.github.com/sinshu/numflat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinshu%2Fnumflat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28914896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T12:13:43.263Z","status":"ssl_error","status_checked_at":"2026-01-30T12:13:22.389Z","response_time":66,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clustering","dsp","fft","linear-algebra","math","matrix","multivariate-analysis","numerics","vector"],"created_at":"2024-10-14T02:43:58.385Z","updated_at":"2026-01-30T15:04:03.376Z","avatar_url":"https://github.com/sinshu.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NumFlat\n\nNumFlat is a numerical computation library written entirely in C#.\n\nThe goal of this project is to provide a lightweight package for handling various mathematical and computational tasks,\nincluding linear algebra, multivariable analysis, clustering, and signal processing, using only C#.\n\n\n\n## Overview\n\nNumFlat provides types named `Vec\u003cT\u003e` and `Mat\u003cT\u003e` for representing vectors and matrices.\nThese type names are intentionally chosen to avoid confusion with vector and matrix types (like `Vector\u003cT\u003e`) from the `System.Numerics` namespace.\nVarious linear algebra-related operations can be performed on these types through operator overloading and extension methods.\n\n`Vec\u003cT\u003e` and `Mat\u003cT\u003e` can hold numerical types that implement the `INumberBase\u003cT\u003e` interface, which was newly added in .NET 7.\nThe primary supported types are `float`, `double`, and `Complex`.\nOther types can be used as well, but support beyond simple arithmetic operations is not provided.\n\n```cs\nVec\u003cdouble\u003e vec = [1, 2, 3];\n\nMat\u003cdouble\u003e mat =\n[\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\nConsole.WriteLine(mat * vec);\n```\n\n\n\n## Installation\n\n.NET 8 is required.\n\n[The NuGet package](https://www.nuget.org/packages/NumFlat) is available.\n\n```\ndotnet add package NumFlat\n```\n\nMost classes are in the `NumFlat` namespace.\n\n```cs\nusing NumFlat;\n```\n\n\n\n## Usage\n\n### Create a new vector\nA new vector can be created by listing elements inside `[]`.\n#### Code\n```cs\n// Create a new vector.\nVec\u003cdouble\u003e vector = [1, 2, 3];\n\n// Show the vector.\nConsole.WriteLine(vector);\n```\n#### Output\n```console\nVector 3-Double\n1\n2\n3\n```\n\n### Create a new vector from `IEnumerable\u003cT\u003e`\nVectors can also be created from objects that implement `IEnumerable\u003cT\u003e`.\nSince the vector itself is an `IEnumerable\u003cT\u003e`, it is also possible to call LINQ methods on the vector if needed.\n#### Code\n```cs\n// Some enumerable.\nvar enumerable = Enumerable.Range(0, 10).Select(i =\u003e i / 10.0);\n\n// Create a vector from an enumerable.\nvar vector = enumerable.ToVector();\n\n// Show the vector.\nConsole.WriteLine(vector);\n```\n#### Output\n```console\nVector 10-Double\n  0\n0.1\n0.2\n0.3\n0.4\n0.5\n0.6\n0.7\n0.8\n0.9\n```\n\n### Indexer access for vectors\nElements in a vector can be accessed or modified through the indexer.\n#### Code\n```cs\n// Create a new vector.\nvar vector = new Vec\u003cdouble\u003e(3);\n\n// Element-wise access.\nvector[0] = 4;\nvector[1] = 5;\nvector[2] = 6;\n\n// Show the vector.\nConsole.WriteLine(vector);\n```\n#### Output\n```console\nVector 3-Double\n4\n5\n6\n```\n\n### Vector arithmetic\nBasic operations on vectors are provided through operator overloading and extension methods.\n#### Code\n```cs\n// Some vectors.\nVec\u003cdouble\u003e x = [1, 2, 3];\nVec\u003cdouble\u003e y = [4, 5, 6];\n\n// Addition.\nvar add = x + y;\n\n// Subtraction.\nvar sub = x - y;\n\n// Multiplication by a scalar.\nvar ms = x * 3;\n\n// Division by a scalar.\nvar ds = x / 3;\n\n// Pointwise multiplication.\nvar pm = x.PointwiseMul(y);\n\n// Pointwise division.\nvar pd = x.PointwiseDiv(y);\n\n// Dot product.\nvar dot = x * y;\n\n// Outer product.\nvar outer = x.Outer(y);\n\n// L2 norm.\nvar l2Norm = x.Norm();\n\n// L1 norm.\nvar l1Norm = x.L1Norm();\n\n// Infinity norm.\nvar infinityNorm = x.InfinityNorm();\n\n// Normalization.\nvar normalized = x.Normalize();\n```\n\n### Subvector\nA subvector can be created from a vector.\nThe subvector acts as a view of the original vector, and changes to the subvector will affect the original vector.\n#### Code\n```cs\n// Some vector.\nVec\u003cdouble\u003e x = [3, 3, 3, 3, 3];\n\n// Create a subvector of the vector.\nvar sub = x[1..4];\n\n// Modify the subvector.\nsub.Fill(100);\n\n// Show the original vector.\nConsole.WriteLine(x);\n```\n#### Output\n```console\nVector 5-Double\n  3\n100\n100\n100\n  3\n```\n\n### Creating matrix\nMatrices can be generated from 2D arrays.\n#### Code\n```cs\n// Create a new matrix.\nMat\u003cdouble\u003e matrix =\n[\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\n// Show the matrix.\nConsole.WriteLine(matrix);\n```\n#### Output\n```console\nMatrix 3x3-Double\n1  2  3\n4  5  6\n7  8  9\n```\n\n### Indexer access for matrices\nElements in a matrix can be accessed or modified through the indexer.\n#### Code\n```cs\n// Creat a new matrix.\nvar matrix = new Mat\u003cdouble\u003e(3, 3);\n\n// Element-wise access.\nfor (var row = 0; row \u003c matrix.RowCount; row++)\n{\n    for (var col = 0; col \u003c matrix.ColCount; col++)\n    {\n        matrix[row, col] = 10 * row + col;\n    }\n}\n\n// Show the matrix.\nConsole.WriteLine(matrix);\n```\n#### Output\n```console\nMatrix 3x3-Double\n 0   1   2\n10  11  12\n20  21  22\n```\n\n### Matrix arithmetic\nBasic operations on matrices are provided through operator overloading and extension methods.\n#### Code\n```cs\n// Some matrices.\nMat\u003cdouble\u003e x =\n[\n    [1, 2, 3],\n    [0, 1, 2],\n    [0, 0, 1],\n];\n\nMat\u003cdouble\u003e y =\n[\n    [1, 0, 0],\n    [2, 1, 0],\n    [3, 2, 1],\n];\n\n// Addition.\nvar add = x + y;\n\n// Subtraction.\nvar sub = x - y;\n\n// Multiplication.\nvar mul = x * y;\n\n// Multiplication by a scalar.\nvar ms = x * 3;\n\n// Division by a scalar.\nvar ds = x / 3;\n\n// Pointwise multiplication.\nvar pm = x.PointwiseMul(y);\n\n// Pointwise division.\nvar pd = x.PointwiseDiv(y);\n\n// Transposition.\nvar transposed = x.Transpose();\n\n// Trace.\nvar trace = x.Trace();\n\n// Determinant.\nvar determinant = x.Determinant();\n\n// Rank.\nvar rank = x.Rank();\n\n// Inverse.\nvar inverse = x.Inverse();\n\n// Pseudo-inverse.\nvar pseudoInverse = x.PseudoInverse();\n\n// Frobenius norm.\nvar frobeniusNorm = x.FrobeniusNorm();\n\n// L1 norm.\nvar l1Norm = x.L1Norm();\n\n// L2 norm.\nvar l2Norm = x.L2Norm();\n\n// Infinity norm.\nvar infinityNorm = x.InfinityNorm();\n```\n\n### Submatrix\nA submatrix can be created from a matrix. The submatrix acts as a view of the original matrix, and changes to the submatrix will affect the original matrix.\n#### Code\n```cs\n// Creat a new matrix.\nvar x = new Mat\u003cdouble\u003e(5, 5);\nx.Fill(3);\n\n// Create a submatrix of the matrix.\nvar sub = x[1..3, 2..4];\n\n// Modify the submatrix.\nsub.Fill(100);\n\n// Show the original matrix.\nConsole.WriteLine(x);\n```\n#### Output\n```console\nMatrix 5x5-Double\n3  3    3    3  3\n3  3  100  100  3\n3  3  100  100  3\n3  3    3    3  3\n3  3    3    3  3\n```\n\n### Matrix as a set of vectors\nViews of rows or columns as vectors can be obtained through the `Rows` or `Cols` properties.\nSimilar to a submatrix, changes to the view will affect the original matrix.\nThese properties implement `IEnumerable\u003cVec\u003cT\u003e\u003e`, allowing for LINQ methods to be called on collections of vectors.\n#### Code\n```cs\n// Some matrix.\nMat\u003cdouble\u003e x =\n[\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\n// Create a view of a row of the matrix.\nVec\u003cdouble\u003e row = x.Rows[0];\n\n// Create a view of a column of the matrix.\nVec\u003cdouble\u003e col = x.Cols[1];\n\n// Convert a matrix to a row-major jagged array.\nvar array = x.Rows.Select(row =\u003e row.ToArray()).ToArray();\n\n// Enumerate all the elements in column-major order.\nvar elements = x.Cols.SelectMany(col =\u003e col);\n\n// The mean vector of the row vectors.\nvar rowMean = x.Rows.Mean();\n\n// The covariance matrix of the column vectors.\nvar colCov = x.Cols.Covariance();\n```\n\n### Matrix decomposition\nThe LU, QR, Cholesky, SVD, EVD, and GEVD for all three major number types `float`, `double`, and `Complex` are available. Below is an example to decompose a matrix using SVD.\n#### Code\n```cs\n// Some matrix.\nMat\u003cdouble\u003e x =\n[\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\n// Do SVD.\nvar decomposition = x.Svd();\n\n// Decomposed matrices.\nvar s = decomposition.S.ToDiagonalMatrix();\nvar u = decomposition.U;\nvar vt = decomposition.VT;\n\n// Reconstruct the matrix.\nvar reconstructed = u * s * vt;\n\n// Show the reconstructed matrix.\nConsole.WriteLine(reconstructed);\n```\n#### Output\n```console\nMatrix 3x3-Double\n1  2  3\n4  5  6\n7  8  9\n```\n\n### Solving linear equations\nLinear equations like `Ax = b` can be solved with the matrix decomposition methods above. Use `Solve()` method to get the solution vector of a given right-hand side vector `b`.\n#### Code\n```cs\n// Some coefficient matrix.\nMat\u003cdouble\u003e a =\n[\n    [1, 2, 3],\n    [1, 4, 9],\n    [2, 3, 5],\n];\n\n// Do LU decomposition.\nvar lu = a.Lu();\n\n// The right-hand vector.\nVec\u003cdouble\u003e b = [1, 2, 3];\n\n// Compute the solution vector.\nvar x = lu.Solve(b);\n\n// Show the solution.\nConsole.WriteLine(x);\n```\n#### Output\n```console\nVector 3-Double\n 2.25\n-1.75\n 0.75\n```\n\n### In-place operations\nMost of the operations have an in-place version, which directly modifies the target vector or matrix without creating a new one.\n#### Code\n```cs\n// Some vector.\nVec\u003cdouble\u003e vector = [1, 2, 3];\n\n// This allocates a new vector.\nvar normalized = vector.Normalize();\n\n// This modifies the original vector.\nvector.NormalizeInplace();\n\n// Some matrix.\nMat\u003cdouble\u003e matrix =\n[\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\n// In-place methods can also directly modify a part of vector or matrix.\nmatrix.Rows[0].NormalizeInplace();\n```\n\n### Reducing memory allocation\nMost of the operations have a non-allocation version, which requires a destination buffer provided by user. Below is an example of matrix addition without heap allocation.\n#### Code\n```cs\n// Some matrices.\nMat\u003cdouble\u003e x =\n[\n    [1, 2],\n    [3, 4],\n];\n\nMat\u003cdouble\u003e y =\n[\n    [5, 6],\n    [7, 8],\n];\n\n// This allocates a new matrix.\nvar answer = x + y;\n\n// The buffer to store the answer.\nvar destination = new Mat\u003cdouble\u003e(2, 2);\n\n// This is the same as 'x + y', but does not allocate heap.\nMat.Add(x, y, destination);\n```\n\n### Multivariate analyses\nThe `NumFlat.MultivariateAnalyses` namespace provides functionality related to multivariate analysis.\nIt currently supports the following methods, with plans to add more methods in the future.\n* Linear regression\n* Logistic regression\n* PCA (principal component analysis)\n* LDA (linear discriminant analysis)\n* ICA (independent component analysis)\n* NMF (non-negative matrix factorization)\n* Classical MDS (classical multidimensional scaling)\n#### Code\n```cs\nusing NumFlat.MultivariateAnalyses;\n\n// Read some data.\nIReadOnlyList\u003cVec\u003cdouble\u003e\u003e xs = ReadSomeData();\n\n// Do PCA.\nvar pca = xs.Pca();\n\nforeach (var x in xs)\n{\n    // Transform the vector based on the PCA.\n    var transformed = pca.Transform(x);\n}\n\n// Read some label.\nIReadOnlyList\u003cint\u003e ys = ReadSomeLabel();\n\n// Do LDA.\nvar lda = xs.Lda(ys);\n\nforeach (var x in xs)\n{\n    // Transform the vector based on the LDA.\n    var transformed = lda.Transform(x);\n}\n```\n\n### Distributions\nThe `NumFlat.Distributions` namespace provides functionality related to probability distributions.\nIt currently supports the multivariate Gaussian distribution and its diagonal covariance matrix variation.\nMaximum likelihood estimation from data, probability density function calculation, and random number generation are possible.\n#### Code\n```cs\nusing NumFlat.Distributions;\n\n// Read some data.\nIEnumerable\u003cVec\u003cdouble\u003e\u003e xs = ReadSomeData();\n\n// Compute the maximum likelihood Gaussian distribution.\nvar gaussian = xs.ToGaussian();\n\nforeach (var x in xs)\n{\n    // Compute the log PDF.\n    var pdf = gaussian.LogPdf(x);\n}\n```\n\n### Clustering\nThe `NumFlat.Clustering` namespace provides functionality related to clustering.\nIt currently supports the following methods, with plans to add more methods in the future.\n* k-means\n* GMM (Gaussian mixture model)\n* k-medoids\n* DBSCAN (density-based spatial clustering of applications with noise)\n#### Code\n```cs\nusing NumFlat.Clustering;\n\n// Read some data.\nIReadOnlyList\u003cVec\u003cdouble\u003e\u003e xs = ReadSomeData();\n\n// Compute a k-means model with 3 clusters.\nvar kMeans = xs.ToKMeans(3);\n\n// Compute a GMM with 3 clusters.\nvar gmm = xs.ToGmm(3);\n```\n\n### Signal processing\nThe `NumFlat.SignalProcessing` namespace provides functionality related to signal processing.\nIt currently supports the following methods, with plans to add more methods in the future.\n* Extract frames using the window function\n* Overlap addition\n* FFT and IFFT\n* STFT and ISTFT\n* Convolution\n* Resampling\n#### Code\n```cs\nusing NumFlat.SignalProcessing;\n\n// Some complex vector.\nvar samples = new Vec\u003cComplex\u003e(256);\nsamples[0] = 1;\n\n// Do FFT.\nvar spectrum = samples.Fft();\n\n// Do IFFT.\nsamples = spectrum.Ifft();\n```\n\n### Leveraging OpenBLAS\nNumFlat's vector and matrix memory formats are compatible with BLAS and LAPACK, allowing you to leverage faster linear algebra libraries like [OpenBLAS](https://github.com/OpenMathLib/OpenBLAS). The following code example demonstrates how to perform SVD using a C# binding of OpenBLAS, [OpenBlasSharp](https://github.com/sinshu/OpenBlasSharp). While NumFlat provides its own SVD implementation, the SVD implementation in OpenBLAS can be expected to offer performance improvements, especially for large matrices.\n#### Code\n```cs\nMat\u003cdouble\u003e a =\n[\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\nvar s = new Vec\u003cdouble\u003e(Math.Min(a.RowCount, a.ColCount));\nvar u = new Mat\u003cdouble\u003e(a.RowCount, a.RowCount);\nvar vt = new Mat\u003cdouble\u003e(a.ColCount, a.ColCount);\nvar work = new Vec\u003cdouble\u003e(s.Count - 1);\n\nfixed (double* pa = a.Memory.Span)\nfixed (double* ps = s.Memory.Span)\nfixed (double* pu = u.Memory.Span)\nfixed (double* pvt = vt.Memory.Span)\nfixed (double* pwork = work.Memory.Span)\n{\n    Lapack.Dgesvd(\n        MatrixLayout.ColMajor,\n        'A', 'A',\n        a.RowCount, a.ColCount,\n        pa, a.Stride, // The content of 'a' will be destroyed.\n        ps,\n        pu, u.Stride,\n        pvt, vt.Stride,\n        pwork);\n}\n\nConsole.WriteLine(u * s.ToDiagonalMatrix() * vt);\n```\n#### Output\n```console\nMatrix 3x3-Double\n1  2  3\n4  5  6\n7  8  9\n```\n\n\n\n## Todo\n\n* ✅ Vector operations\n    - ✅ Builder\n    - ✅ Indexer\n    - ✅ Subvector\n    - ✅ Copy, fill, clear\n    - ✅ Arithmetic operations\n    - ✅ Dot and outer products\n    - ✅ Norm and normalization\n    - ✅ In-place operations\n* ✅ Matrix operations\n    - ✅ Builder\n    - ✅ Indexer\n    - ✅ Submatrix\n    - ✅ Copy, fill, clear\n    - ✅ Arithmetic operations\n    - ✅ Transposition\n    - ✅ Trace\n    - ✅ Determinant\n    - ✅ Rank\n    - ✅ Inversion\n    - ✅ Pseudo-inverse\n    - ✅ Norm\n    - ✅ In-place operations\n* ✅ Matrix Decomposition\n    - ✅ LU decomposition\n    - ✅ QR decomposition\n    - ✅ Cholesky decomposition\n    - ✅ SVD (singular value decomposition)\n    - ✅ EVD (eigenvalue decomposition)\n    - ✅ GEVD (generalized eigenvalue decomposition)\n* ✅ LINQ-like operations\n    - ✅ Sum, mean, variance, covariance for scalars\n    - ✅ Sum, mean, variance, covariancee for vectors\n    - ✅ Sum, mean, variance for matrices\n    - ✅ Weighted sum, mean, variance, covariance for scalars\n    - ✅ Weighted sum, mean, variance, covariance for vectors\n    - ✅ Weighted sum, mean, variance for matrices\n    - ✅ Higher-order statistics\n* ⬜ Multivariate analysis\n    - ✅ Linear regression\n    - ✅ Logistic regression\n    - ✅ PCA (principal component analysis)\n    - ✅ LDA (linear discriminant analysis)\n    - ✅ ICA (independent component analysis)\n    - ✅ NMF (non-negative matrix factorization)\n    - ⬜ Multinomial logistic regression\n    - ✅ Kernel PCA\n    - ⬜ Kernel discriminant analysis\n    - ✅ CSP (common spatial pattern)\n    - ✅ Classical MDS (classical multidimensional scaling)\n    - ⬜ t-SNE\n    - ⬜ UMAP\n* ⬜ Distributions\n    - ✅ Gaussian\n    - ✅ Diagonal Gaussian\n    - ⬜ Other distributions\n    - ✅ Earth mover's distance\n* 🚧 Clustering\n    - ✅ k-means\n    - ✅ GMM (gaussian mixture model)\n    - ✅ k-medoids\n    - ✅ DBSCAN (density-based spatial clustering of applications with noise)\n    - ⬜ OPTICS\n* ⬜ Classification\n    - ⬜ Bayes classifier\n    - ⬜ SVM (support vector machine)\n* 🚧 Time series\n    - ✅ DTW (dynamic time warping)\n    - ✅ sDTW (subsequence dynamic time warping)\n    - 🚧 HMM (hidden Markov model)\n* 🚧 Signal processing\n    - ✅ FFT (fast Fourier transform)\n    - ✅ Real FFT\n    - ✅ STFT (short-time Fourier transform)\n    - ✅ Convolution\n    - ✅ Resampling\n    - 🚧 Feature extraction\n    - ⬜ Filtering\n* ✅ File IO\n    - ✅ CSV\n    - ✅ WAV\n\n\n\n## License\n\nNumFlat depends on the following libraries.\n\n* [MatFlat](https://github.com/sinshu/matflat) ([MIT license](https://github.com/sinshu/matflat/blob/main/LICENSE.txt))\n* [FftFlat](https://github.com/sinshu/fftflat) ([MIT license](https://github.com/sinshu/fftflat/blob/main/LICENSE.md))\n\nNumFlat is available under [the MIT license](LICENSE.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsinshu%2Fnumflat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsinshu%2Fnumflat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsinshu%2Fnumflat/lists"}