本系列为darknet源码解析,本次解析src/matrix.h 与 src/matrix.c 两个。
matrix.h 中的包含的代码如下:
#ifndef MATRIX_H
#define MATRIX_H
#include "darknet.h"
// 将矩阵m中的数据拷贝到内存中
matrix copy_matrix(matrix m);
// 可视化
void print_matrix(matrix m);
//从矩阵中采样m行数据,返回采样后的结果;
matrix hold_out_matrix(matrix *m, int n);
// 矩阵的行数和列数进行resize操作,resize矩阵大小是size * size
matrix resize_matrix(matrix m, int size);
//获取矩阵中某一列数据,并把该列删除掉
float *pop_column(matrix *m, int c);
#endif
首先,我们分析matrix.h 中的源码,基础数据结构list 定义在 darknet.h 中,其定义如下:
typedef struct matrix{
int rows, cols; // 行数,列数
float **vals; // 二维float数组
} matrix;
matrix.c 中函数的详细分析如下,
#include "matrix.h"
#include "utils.h"
#include "blas.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
/**
* 释放矩阵的存储空间
* @param matrix 待释放存储空间矩阵 m
*/
void free_matrix(matrix m)
{
int i;
// 逐行释放存储空间;
for(i = 0; i < m.rows; ++i) free(m.vals[i]);
free(m.vals);
}
/**
* emmm...... 暂时不能理解这波操作,先空在这里,看上层怎么用???
* @param truth 矩阵
* @param guess
* @param k 取top的个数
* @return 查找的准确率
*/
float matrix_topk_accuracy(matrix truth, matrix guess, int k)
{
// 申请k个int类型存储空间,
int *indexes = calloc(k, sizeof(int));
int n = truth.cols;// n 保存truth矩阵的列数
int i,j;
int correct = 0;
for(i = 0; i < truth.rows; ++i