MATH_FUNCTION

主要函数

math_function 定义了caffe 中用到的一些矩阵操作和数值计算的一些函数,这里以float类型为例做简单的分析

1. caffe_cpu_gemm 函数:

template<>
void caffe_cpu_gemm<float>(const CBLAS_TRANSPOSE TransA,
    const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K,
    const float alpha, const float* A, const float* B, const float beta,
    float* C) {
  int lda = (TransA == CblasNoTrans) ? K : M;
  int ldb = (TransB == CblasNoTrans) ? N : K;
  cblas_sgemm(CblasRowMajor, TransA, TransB, M, N, K, alpha, A, lda, B,
      ldb, beta, C, N);
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

功能: C=alpha*A*B+beta*C 
A,B,C 是输入矩阵(一维数组格式) 
CblasRowMajor :数据是行主序的(二维数据也是用一维数组储存的) 
TransA, TransB:是否要对A和B做转置操作(CblasTrans CblasNoTrans) 
M: A、C 的行数 
N: B、C 的列数 
K: A 的列数, B 的行数 
lda : A的列数(不做转置)行数(做转置) 
ldb: B的列数(不做转置)行数(做转置)

2. caffe_cpu_gemv 函数:

template <>
void caffe_cpu_gemv<float>(const CBLAS_TRANSPOSE TransA, const int M,
    const int N, const float alpha, const float* A, const float* x,
    const float beta, float* y) {
  cblas_sgemv(CblasRowMajor, TransA, M, N, alpha, A, N, x, 1, beta, y, 1);
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

功能: y=alpha*A*x+beta*y 
其中X和Y是向量,A 是矩阵 
M:A 的行数 
N:A 的列数 
cblas_sgemv 中的 参数1 表示对X和Y的每个元素都进行操作

3.caffe_axpy 函数:

template <>
void caffe_axpy<float>(const int N, const float alpha, const float* X,
    float* Y) { cblas_saxpy(N, alpha, X, 1, Y, 1); }
   
   
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

功能: Y=alpha*X+Y 
N:为X和Y中element的个数

4.caffe_set 函数:

template <typename Dtype>
void caffe_set(const int N, const Dtype alpha, Dtype* Y) {
  if (alpha == 0) {
    memset(Y, 0, sizeof(Dtype) * N);  // NOLINT(caffe/alt_fn)
    return;
  }
  for (int i = 0; i < N; ++i) {
    Y[i] = alpha; 
  }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

功能:用常数 alpha 对 Y 进行初始化 
函数 void *memset(void *buffer, char c, unsigned count) 一般为新申请的内存做初始化,功能是将buffer所指向内存中的每个字节的内容全部设置为c指定的ASCII值, count为块的大小

5.caffe_add_scalar 函数:

template <>
void caffe_add_scalar(const int N, const float alpha, float* Y) {
  for (int i = 0; i < N; ++i) {
    Y[i] += alpha;
  }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

功能: 给 Y 的每个 element 加上常数 alpha

6.caffe_copy 函数:

template <typename Dtype>
void caffe_copy(const int N, const Dtype* X, Dtype* Y) {
  if (X != Y) {
    if (Caffe::mode() == Caffe::GPU) {
#ifndef CPU_ONLY
      // NOLINT_NEXT_LINE(caffe/alt_fn)
      CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault));
#else
      NO_GPU;
#endif
    } else {
      memcpy(Y, X, sizeof(Dtype) * N);  // NOLINT(caffe/alt_fn)
    }
  }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

函数 void *memcpy(void *dest, void *src, unsigned int count) 把src所指向的内存区域 copy到dest所指向的内存区域, count为块的大小

7.caffe_scal 函数:

template <>
void caffe_scal<float>(const int N, const float alpha, float *X) {
  cblas_sscal(N, alpha, X, 1);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

功能:X = alpha*X 
N: X中element的个数

8.caffeine_cup_axpby 函数:

template <>
void caffe_cpu_axpby<float>(const int N, const float alpha, const float* X,
                            const float beta, float* Y) {
  cblas_saxpby(N, alpha, X, 1, beta, Y, 1);
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

功能:Y= alpha*X+beta*Y

9.caffe_add、 caffe_sub、 caffe_mul、 caffe_div 函数:

template <>
void caffe_add<float>(const int n, const float* a, const float* b,
    float* y) {
  vsAdd(n, a, b, y);
}
template <>
void caffe_sub<float>(const int n, const float* a, const float* b,
    float* y) {
  vsSub(n, a, b, y);
}

template <>
void caffe_mul<float>(const int n, const float* a, const float* b,
    float* y) {
  vsMul(n, a, b, y);
}

template <>
void caffe_div<float>(const int n, const float* a, const float* b,
    float* y) {
  vsDiv(n, a, b, y);
}


   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

功能:这四个函数分别实现element-wise的加减乘除(y[i] = a[i] + - * \ b[i])

10.caffe_powx、 caffe_sqr、 caffe_exp、 caffe_abs 函数:

template <>
void caffe_powx<float>(const int n, const float* a, const float b,
    float* y) {
  vsPowx(n, a, b, y);
}

template <>
void caffe_sqr<float>(const int n, const float* a, float* y) {
  vsSqr(n, a, y);
}


template <>
void caffe_exp<float>(const int n, const float* a, float* y) {
  vsExp(n, a, y);
}

template <>
void caffe_abs<float>(const int n, const float* a, float* y) {
    vsAbs(n, a, y);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

功能 : 同样是element-wise操作,分别是y[i] = a[i] ^ b, y[i] = a[i]^2,y[i] = exp(a[i] ),y[i] = |a[i] |

11.int caffe_rng_rand 函数:

unsigned int caffe_rng_rand() {
  return (*caffe_rng())();
}
   
   
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

功能:返回一个随机数

12.caffe_nextafer 函数:

template <typename Dtype>
Dtype caffe_nextafter(const Dtype b) {
  return boost::math::nextafter<Dtype>(
      b, std::numeric_limits<Dtype>::max());
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

功能 : 返回 b 最大方向上可以表示的最接近的数值。

13.caffe_cpu_strided_dot 函数:

template <>
double caffe_cpu_strided_dot<double>(const int n, const double* x,
    const int incx, const double* y, const int incy) {
  return cblas_ddot(n, x, incx, y, incy);
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

功能: 返回 vector X 和 vector Y 的内积。 
incx, incy : 步长,即每隔incx 或 incy 个element 进行操作。

14.caffe_cpu_hamming_distance 函数:

template <>
int caffe_cpu_hamming_distance<float>(const int n, const float* x,
                                  const float* y) {
  int dist = 0;
  for (int i = 0; i < n; ++i) {
    dist += __builtin_popcount(static_cast<uint32_t>(x[i]) ^
                               static_cast<uint32_t>(y[i]));
  }
  return dist;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

功能:返回 x 和 y 之间的海明距离。(两个等长字符串之间的海明距离是两个字符串对应位置的不同字符的个数。)

15. caffe_cpu_asum 函数:

template <>
float caffe_cpu_asum<float>(const int n, const float* x) {
  return cblas_sasum(n, x, 1);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

功能:计算 vector x 的所有element的绝对值之和。

16.caffe_cpu_scale 函数:

template <>
void caffe_cpu_scale<float>(const int n, const float alpha, const float *x,
                            float* y) {
  cblas_scopy(n, x, 1, y, 1);
  cblas_sscal(n, alpha, y, 1);
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

功能:y = alpha*x

Imports System.Globalization Imports System.Math Imports System.Collections.Generic Namespace xFunction Public Class f Const NumList = "零壹贰叁肆伍陆柒捌玖" Const UnitList = "仟佰拾亿仟佰拾万仟佰拾元角分" Public Shared Sub StringList() Dim tmepList As New List(Of String) Console.WriteLine(vbLf & "Capacity: {0}", tmepList.Capacity) tmepList.Add("Tyrannosaurus") tmepList.Add("Amargasaurus") tmepList.Add("Mamenchisaurus") tmepList.Add("Deinonychus") tmepList.Add("Compsognathus") Console.WriteLine() For Each dinosaur As String In tmepList Console.WriteLine(dinosaur) Next Console.WriteLine(vbLf & "Capacity: {0}", tmepList.Capacity) Console.WriteLine("Count: {0}", tmepList.Count) Console.WriteLine(vbLf & "Contains(""Deinonychus""): {0}", _ tmepList.Contains("Deinonychus")) Console.WriteLine(vbLf & "Insert(2, ""Compsognathus"")") tmepList.Insert(2, "Compsognathus") Console.WriteLine() For Each dinosaur As String In tmepList Console.WriteLine(dinosaur) Next Console.WriteLine(vbLf & "tmepList(3): {0}", tmepList(3)) Console.WriteLine(vbLf & "Remove(""Compsognathus"")") tmepList.Remove("Compsognathus") Console.WriteLine() For Each dinosaur As String In tmepList Console.WriteLine(dinosaur) Next tmepList.TrimExcess() Console.WriteLine(vbLf & "TrimExcess()") Console.WriteLine("Capacity: {0}", tmepList.Capacity) Console.WriteLine("Count: {0}", tmepList.Count) tmepList.Clear() Console.WriteLine(vbLf & "Clear()") Console.WriteLine("Capacity: {0}", tmepList.Capacity) Console.WriteLine("Count: {0}", tmepList.Count) End Sub #Region "RMB number to Word" Public Shared Function RmbNumberToWordFull(ByVal Number As Decimal) As String 'RMB 数字大写 If Number = 0 Then Return "零元整" If Number > 999999999999D Then Return "Error" Try Dim unitCharSet() As Char = UnitList.ToCharArray Dim digitalCharSet() As Char = NumList.ToCharArray Dim sOriginalNumber As String = CStr(Round(Number * 100, 0)) Dim cOriginalCharSet() As Char = sOriginalNumber.ToCharArray Dim numWords As String = "" Array.Reverse(cOriginalCharSet) Array.Reverse(unitCharSet) For i As Int16 = 0 To cOriginalCharSet.Length - 1 numWords = digitalCharSet(Val(cOriginalCharSet(i))) & unitCharSet(i) & numWords Next Return numWords Catch ex As Exception 'MessageBox.Show(ex.Message) Return "Error" End Try End Function Public Shared Function RmbNumberToWordStandard(ByVal Number As Decimal) As String Dim numWords As String = "" If Number = 0 Then Return "零元整" Try numWords = RmbNumberToWordFull(Number) For i As Int16 = 1 To 4 numWords = numWords.Replace("零仟", "零") numWords = numWords.Replace("零佰", "零") numWords = numWords.Replace("零拾", "零") numWords = numWords.Replace("零零", "零") numWords = numWords.Replace("零亿", "亿") numWords = numWords.Replace("零万", "万") numWords = numWords.Replace("零元", "元") numWords = numWords.Replace("亿万", "亿") numWords = numWords.Replace("零角零分", "整") numWords = numWords.Replace("零角", "零") numWords = numWords.Replace("零分", "整") Next Return numWords Catch ex As Exception Return "Error" End Try End Function #End Region End Class Public Class Collection(Of ItemType) Shared Items As New List(Of ItemType) Public Shared Sub Add(ByVal Value As ItemType) Items.Add(Value) End Sub Public Shared Function GetList() As ItemType End Function End Class Public Class xDatetime 'Dateteim convertion class,All functions are shared. Public Shared Function GetMonthList(Optional ByVal MonthCount As Int16 = 5) As String() If MonthCount = 0 Then MonthCount = 1 End If Dim ItemCount As UInt16 = Math.Abs(MonthCount) - 1 Dim dt As Date Dim Monthlist(ItemCount) As String dt = Date.Today For iMonth As Int16 = 0 To ItemCount Step 1 Dim newDT As Date If MonthCount >= 0 Then newDT = DateAdd(DateInterval.Month, iMonth, dt) Else newDT = DateAdd(DateInterval.Month, iMonth + MonthCount, dt) End If Monthlist(iMonth) = newDT.ToString("yyyyMM") Next Return Monthlist End Function Public Shared Function CYYYYMMToMMM(ByVal RegionName As String, ByVal sYYYYMM As String) As String 'Convert month formatn egg .convert "201101" to "Jan" 'Note: string start position is begin form 0 Dim dt As DateTime = New DateTime(sYYYYMM.Substring(0, 4), sYYYYMM.Substring(4, 2), 1) Select Case RegionName Case "US" CYYYYMMToMMM = dt.ToString("MMM", DateTimeFormatInfo.InvariantInfo) Case "CN" CYYYYMMToMMM = dt.ToString("MMM", DateTimeFormatInfo.InvariantInfo) Case Else CYYYYMMToMMM = dt.ToString("MMM", DateTimeFormatInfo.InvariantInfo) End Select End Function Public Shared Function MonthFirstDayYYYYMMDD(ByVal sYYYYMM As String) As String Dim dt As DateTime = New DateTime(sYYYYMM.Substring(0, 4), sYYYYMM.Substring(4, 2), 1) Return dt.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo) End Function Public Shared Function MonthLastDayYYYYMMDD(ByVal sYYYYMM As String) As String Dim dt As DateTime = New DateTime(sYYYYMM.Substring(0, 4), sYYYYMM.Substring(4, 2), 1) dt = dt.AddMonths(1).AddDays(-1) Return dt.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo) End Function End Class End Namespace
引用\[1\]中提到,函数表达式可以是匿名函数,也可以是有名函数。匿名函数没有函数名,而有名函数有一个函数名。例如,在给定的代码中,num1是一个有名函数,而num2是一个匿名函数。\[1\] 引用\[2\]中提到,函数表达式中的函数提升。在给定的代码中,虽然函数表达式var func = function sum(a,b){}在前面被提升,但是函数的实际声明在后面。因此,在console.log(sum(10,10))中调用sum函数会报错,因为函数还没有被声明。\[2\] 引用\[3\]中提到,函数可以写多个return语句,但是只有一个return语句会被执行。在给定的代码中,函数func接受两个参数并返回它们的和。函数func也可以作为参数传递给其他函数。例如,func(func(10,20),30)将返回60,因为它首先计算func(10,20)的结果为30,然后将30作为参数传递给func函数,最终返回60。\[3\] 根据以上引用内容,math_func函数的具体定义和用途没有提及。如果你能提供更多关于math_func函数的信息,我将能够为你提供更准确的答案。 #### 引用[.reference_title] - *1* *2* *3* [function 函数](https://blog.csdn.net/weixin_46376652/article/details/123998882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值