C语言求均值和标准差函数
时间: 2024-05-16 08:11:32 浏览: 27
C语言中求均值和标准差的函数可以分别用以下方式实现:
求均值:
```c
double mean(double arr[], int n) {
double sum = 0.0;
for(int i = 0; i < n; i++) {
sum += arr[i];
}
return sum / n;
}
```
求标准差:
```c
double standard_deviation(double arr[], int n) {
double avg = mean(arr, n);
double sum = 0.0;
for(int i = 0; i < n; i++) {
sum += (arr[i] - avg) * (arr[i] - avg);
}
return sqrt(sum / n);
}
```
以上代码分别定义了求均值和求标准差的函数,均使用了数组作为输入参数,并返回相应的计算结果。其中,求标准差的函数内部调用了求均值的函数,因此需要先定义求均值的函数。
相关问题
C语言实现求取矩阵的高斯均值矩阵
高斯均值滤波是一种图像处理算法,用于平滑图像并消除噪声。其基本思想是将像素点周围的像素值按照高斯分布加权平均,以达到平滑的效果。在矩阵中实现高斯均值滤波的步骤如下:
1. 定义高斯核矩阵
首先需要定义一个高斯核矩阵,其大小和标准差决定了平滑的程度。常用的大小为3x3或5x5,标准差一般取1或2。
2. 对于每个像素点,计算其周围像素点的加权平均值
对于每个像素点,找到它周围的所有像素点,并计算它们与该像素点之间的距离。将距离带入高斯分布函数中,得到每个像素点的权重。然后将每个像素点的权重与其对应的像素值相乘,再求和,得到该像素点的加权平均值。最后将该值赋给该像素点。
3. 遍历整个矩阵,重复步骤2
对于矩阵中的每个像素点,都执行步骤2,得到其加权平均值,并将其赋给该像素点。遍历整个矩阵,重复这个过程,直到所有像素点都被处理过。
下面是一个示例代码,实现了对一个3x3的矩阵进行高斯均值滤波,其中高斯核矩阵大小为3x3,标准差为1:
```
#include <stdio.h>
#include <math.h>
// 高斯分布函数
double gaussian(double x, double mean, double std) {
return exp(-(pow(x-mean, 2)/(2*pow(std, 2))));
}
// 高斯均值滤波
void gaussian_filter(double matrix[][3], int rows, int cols) {
// 定义高斯核矩阵
double kernel[3][3] = {
{1, 2, 1},
{2, 4, 2},
{1, 2, 1}
};
double sum = 0;
// 计算高斯核矩阵的总和
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
sum += kernel[i][j];
}
}
// 对每个像素点进行高斯均值滤波
for (int i = 1; i < rows-1; i++) {
for (int j = 1; j < cols-1; j++) {
double mean = 0;
// 计算该像素点周围的像素点的加权平均值
for (int k = -1; k <= 1; k++) {
for (int l = -1; l <= 1; l++) {
mean += matrix[i+k][j+l] * kernel[k+1][l+1];
}
}
mean /= sum;
// 将加权平均值赋给该像素点
matrix[i][j] = mean;
}
}
}
int main() {
// 定义一个3x3的矩阵
double matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 对矩阵进行高斯均值滤波
gaussian_filter(matrix, 3, 3);
// 输出结果
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%.2f ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
```
输出结果为:
```
3.00 4.00 5.00
6.00 7.00 8.00
9.00 10.00 11.00
```
C语言 正态分布随机函数
C语言中可以使用rand()函数生成随机数,但是它生成的是均匀分布的随机数,如果需要生成正态分布的随机数,可以使用Box-Muller变换。具体实现可以参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double rand_normal(double mu, double sigma) {
static double z0, z1;
static int flag = 0;
flag = !flag;
if (!flag)
return z1 * sigma + mu;
double u1, u2;
do {
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
} while (u1 <= 1e-7);
double r = sqrt(-2.0 * log(u1));
double theta = 2.0 * M_PI * u2;
z0 = r * cos(theta);
z1 = r * sin(theta); return z0 * sigma + mu;
}
int main() {
srand(time(NULL));
for (int i = 0; i < 10; i++) {
printf("%lf\n", rand_normal(0, 1));
}
return 0;
}
```
其中,rand_normal函数的参数mu和sigma分别表示正态分布的均值和标准差。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)