2023-04-19 11:31:01 +08:00
|
|
|
|
#ifndef AURORA_FUNCTION2D_H
|
|
|
|
|
|
#define AURORA_FUNCTION2D_H
|
|
|
|
|
|
|
2023-05-10 13:46:40 +08:00
|
|
|
|
#include <cstdio>
|
|
|
|
|
|
#include <initializer_list>
|
|
|
|
|
|
|
2023-04-20 15:34:38 +08:00
|
|
|
|
#include "Matrix.h"
|
|
|
|
|
|
#include "Function1D.h"
|
2023-04-19 11:31:01 +08:00
|
|
|
|
|
2023-05-05 13:22:15 +08:00
|
|
|
|
namespace Aurora
|
|
|
|
|
|
{
|
|
|
|
|
|
enum FunctionDirection
|
|
|
|
|
|
{
|
2023-04-23 16:02:08 +08:00
|
|
|
|
Column,
|
|
|
|
|
|
Row,
|
|
|
|
|
|
All
|
|
|
|
|
|
};
|
2023-10-08 15:58:43 +08:00
|
|
|
|
float immse(const Matrix &aImageA, const Matrix &aImageB);
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix inv(const Matrix &aMatrix);
|
|
|
|
|
|
Matrix inv(Matrix &&aMatrix);
|
|
|
|
|
|
Matrix interp2(const Matrix &aX, const Matrix &aY, const Matrix &aV, const Matrix &aX1, const Matrix &aY1, InterpnMethod aMethod);
|
|
|
|
|
|
Matrix interpn(const Matrix &aX, const Matrix &aY, const Matrix &aV, const Matrix &aX1, const Matrix &aY1, InterpnMethod aMethod);
|
|
|
|
|
|
Matrix std(const Matrix &aMatrix);
|
2023-04-23 16:02:08 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 求矩阵最小值,可按行、列、单元, 目前不支持三维,不支持复数
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-04-23 16:02:08 +08:00
|
|
|
|
* @param direction 方向,Column, Row, All
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix min(const Matrix &aMatrix, FunctionDirection direction = Column);
|
2023-04-23 16:02:08 +08:00
|
|
|
|
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix min(const Matrix &aMatrix, FunctionDirection direction, long &rowIdx, long &colIdx);
|
2023-04-24 16:02:15 +08:00
|
|
|
|
|
2023-04-23 16:02:08 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 求矩阵最小值,可按行、列、单元, 目前不支持三维,不支持复数
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-04-23 16:02:08 +08:00
|
|
|
|
* @param direction 方向,Column, Row, All
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @return 最大值矩阵
|
2023-04-23 16:02:08 +08:00
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix max(const Matrix &aMatrix, FunctionDirection direction = Column);
|
2023-04-23 17:32:04 +08:00
|
|
|
|
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix max(const Matrix &aMatrix, FunctionDirection direction, long &rowIdx, long &colIdx);
|
2023-04-24 16:02:15 +08:00
|
|
|
|
|
2023-04-23 16:02:08 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 比较两个矩阵,求对应位置的最小值,不支持三维
|
|
|
|
|
|
* @attention 矩阵形状不一样时,如A为[MxN],则B应为标量或[1xN]的行向量
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵1
|
|
|
|
|
|
* @param aOther 目标矩阵2
|
|
|
|
|
|
* @return 最小值矩阵
|
2023-04-23 16:02:08 +08:00
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix min(const Matrix &aMatrix, const Matrix &aOther);
|
2023-04-23 16:02:08 +08:00
|
|
|
|
|
2023-05-19 13:44:00 +08:00
|
|
|
|
/**
|
2023-05-15 16:23:06 +08:00
|
|
|
|
* 比较两个矩阵,求对应位置的最大值,不支持三维
|
|
|
|
|
|
* @attention 矩阵形状不一样时,如A为[MxN],则B应为标量或[1xN]的行向量
|
|
|
|
|
|
* @param aMatrix 目标矩阵1
|
|
|
|
|
|
* @param aOther 目标矩阵2
|
|
|
|
|
|
* @return 最大值矩阵
|
|
|
|
|
|
*/
|
|
|
|
|
|
Matrix max(const Matrix &aMatrix, const Matrix &aOther);
|
|
|
|
|
|
|
2023-05-19 13:44:00 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 比较矩阵和产量,求对应位置的最大值
|
|
|
|
|
|
* @attention 矩阵形状不一样时,如A为[MxN],则B应为标量或[1xN]的行向量
|
|
|
|
|
|
* @param aMatrix 目标矩阵1
|
|
|
|
|
|
* @param aOther 目标矩阵2
|
|
|
|
|
|
* @return 最大值矩阵
|
|
|
|
|
|
*/
|
2023-10-08 15:58:43 +08:00
|
|
|
|
Matrix max(const Matrix &aMatrix, const float aValue);
|
2023-05-19 13:44:00 +08:00
|
|
|
|
|
2023-04-23 17:32:04 +08:00
|
|
|
|
/**
|
2023-04-25 17:28:33 +08:00
|
|
|
|
* 求矩阵和,可按行、列、单元, 目前不支持三维
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-04-23 17:32:04 +08:00
|
|
|
|
* @param direction 方向,Column, Row, All
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @return 求和结果矩阵
|
2023-04-23 17:32:04 +08:00
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix sum(const Matrix &aMatrix, FunctionDirection direction = Column);
|
2023-04-23 17:32:04 +08:00
|
|
|
|
|
2023-04-24 15:24:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 求矩阵平均值,可按行、列、单元, 目前不支持三维,不支持复数
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-04-24 15:24:23 +08:00
|
|
|
|
* @param direction 方向,Column, Row, All
|
|
|
|
|
|
* @param aIncludeNan 是否包含nan
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @return 平均值矩阵
|
2023-04-24 15:24:23 +08:00
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix mean(const Matrix &aMatrix, FunctionDirection direction = Column, bool aIncludeNan = true);
|
2023-04-24 15:24:23 +08:00
|
|
|
|
|
2023-04-25 13:02:11 +08:00
|
|
|
|
/**
|
2023-05-24 11:04:36 +08:00
|
|
|
|
* @brief 矩阵排序 按列, 目前不支持三维,不支持复数
|
|
|
|
|
|
*
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-05-24 11:04:36 +08:00
|
|
|
|
* @param direction 排序方向。不支持ALL
|
|
|
|
|
|
* @return Matrix 排序后矩阵
|
2023-04-25 13:02:11 +08:00
|
|
|
|
*/
|
2023-05-24 11:04:36 +08:00
|
|
|
|
Matrix sort(const Matrix &aMatrix,FunctionDirection direction = Column);
|
2023-04-25 13:02:11 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
2023-05-24 11:04:36 +08:00
|
|
|
|
* @brief 矩阵排序 按列, 目前不支持三维,不支持复数
|
|
|
|
|
|
*
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-05-24 11:04:36 +08:00
|
|
|
|
* @param direction 排序方向。不支持ALL
|
|
|
|
|
|
* @return Matrix 排序后矩阵
|
2023-04-25 13:02:11 +08:00
|
|
|
|
*/
|
2023-05-24 11:04:36 +08:00
|
|
|
|
Matrix sort(Matrix &&aMatrix,FunctionDirection direction = Column);
|
2023-04-25 13:02:11 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
2023-05-24 11:04:36 +08:00
|
|
|
|
* 基于第一列中的元素按升序对矩阵行进行排序。
|
|
|
|
|
|
* 当第一列包含重复的元素时,sortrows 会根据下一列中的值进行排序,并对后续的相等值重复此行为。
|
|
|
|
|
|
* @attention 目前不支持三维,不支持复数
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-05-24 11:04:36 +08:00
|
|
|
|
* @param indexMatrix 排序后各行的原索引矩阵指针,非必须
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @return 排序后矩阵
|
|
|
|
|
|
*/
|
2023-05-24 11:04:36 +08:00
|
|
|
|
Matrix sortrows(const Matrix &aMatrix, Matrix* indexMatrix=nullptr);
|
2023-04-25 09:41:40 +08:00
|
|
|
|
|
2023-04-25 13:02:11 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 对矩阵求中间值 按列, 目前不支持三维,不支持复数
|
|
|
|
|
|
* @param aMatrix 目标矩阵
|
|
|
|
|
|
* @return 中值矩阵
|
|
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix median(const Matrix &aMatrix);
|
2023-04-25 13:02:11 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* FFT,支持到2维,输入可以是常数可以是复数,输出必是复数
|
|
|
|
|
|
* @param aMatrix 目标矩阵
|
2023-05-06 15:49:19 +08:00
|
|
|
|
* @param aFFTSize 目标矩阵需要处理的长度,默认为-1即全部
|
2023-04-25 13:02:11 +08:00
|
|
|
|
* @return fft后的复数矩阵
|
|
|
|
|
|
*/
|
2023-05-06 15:49:19 +08:00
|
|
|
|
Matrix fft(const Matrix &aMatrix, long aFFTSize = -1);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* fftshift,在原有数据上进行修改,将fft的数据的前半部分和后半部分交换,支持2D数据
|
|
|
|
|
|
* @param aMatrix
|
|
|
|
|
|
*/
|
|
|
|
|
|
void fftshift(Matrix &aMatrix);
|
2023-04-25 13:02:11 +08:00
|
|
|
|
|
2023-06-08 15:24:49 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* fftshift,在原有数据上进行修改,将fft的数据的前半部分和后半部分交换,支持2D数据
|
|
|
|
|
|
* @param aMatrix
|
|
|
|
|
|
*/
|
|
|
|
|
|
void ifftshift(Matrix &aMatrix);
|
|
|
|
|
|
|
2023-04-25 13:02:11 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 逆fft,支持到2维,输入必须是复数,输出必是复数
|
|
|
|
|
|
* @attention 如有需要可使用real去除虚部
|
|
|
|
|
|
* @param aMatrix
|
|
|
|
|
|
* @return ifft后的复数矩阵
|
|
|
|
|
|
*/
|
2023-06-09 14:31:47 +08:00
|
|
|
|
Matrix ifft(const Matrix &aMatrix, long aFFTSize = -1);
|
2023-05-05 13:22:15 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Symmetric逆fft,支持到2维,输入必须是复数,输出必是实数
|
|
|
|
|
|
* @param aMatrix
|
|
|
|
|
|
* @return ifft后的实数矩阵
|
|
|
|
|
|
*/
|
|
|
|
|
|
Matrix ifft_symmetric(const Matrix &aMatrix,long length);
|
2023-04-25 13:02:11 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* hilbert,支持到2维,输入必须是复数,输出必是复数
|
|
|
|
|
|
* @param aMatrix
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix hilbert(const Matrix &aMatrix);
|
2023-04-25 17:28:33 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* prod,支持到2维
|
|
|
|
|
|
* @param aMatrix
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix prod(const Matrix &aMatrix);
|
2023-04-25 17:28:33 +08:00
|
|
|
|
|
2023-05-05 13:22:15 +08:00
|
|
|
|
Matrix dot(const Matrix &aMatrix, const Matrix &aOther, FunctionDirection direction = Column);
|
2023-05-10 13:46:40 +08:00
|
|
|
|
|
2023-05-11 16:21:01 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 转换下标为索引值
|
|
|
|
|
|
* @attention 索引值按照其实为1与matlab对应,在C++中使用需要-1
|
|
|
|
|
|
* @param aVMatrixSize
|
|
|
|
|
|
* @param aSliceIdxs
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2023-05-10 13:46:40 +08:00
|
|
|
|
Matrix sub2ind(const Matrix &aVMatrixSize, std::initializer_list<Matrix> aSliceIdxs);
|
|
|
|
|
|
|
2023-04-19 11:31:01 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2023-05-05 13:22:15 +08:00
|
|
|
|
#endif // AURORA_FUNCTION2D_H
|