class DEA { private: vector<vector<double>> inputs; // 输入变量 vector<vector<double>> outputs; // 输出变量 vector<double> weights; // 权重 int n; // 数据点数量 int m; // 变量数量 public: DEA(vector<vector<double>> inputs_, vector<vector<double>> outputs_) { inputs = inputs_; outputs = outputs_; n = inputs.size(); m = inputs[0].size() + outputs[0].size(); weights.resize(n); } // 计算距离,确保距离不越界 double distance(vector<double> x, vector<double> y) { double d = 0.0; for (int i = 0; i < m; i++) { d += pow(x[i] - y[i], 2); } return sqrt(d) + 1e-6; // 避免距离为0 } // 计算相对效率 double efficiency(vector<double> x) { double numerator = 0.0; double denominator = 0.0; for (int i = 0; i < n; i++) { double d = distance(x, inputs[i]); numerator += weights[i] * outputs[i][0] / d; denominator += weights[i] / d; } return numerator / denominator; } // 计算权重 void calculateWeights() { for (int i = 0; i < n; i++) { double numerator = 0.0; double denominator = 0.0; for (int j = 0; j < n; j++) { double d = distance(inputs[i], inputs[j]); numerator += outputs[j][0] * d; denominator += d; } weights[i] = numerator / denominator; } } // 返回权重 vector<double> getWeights() { return weights; } }; 什么方法计算的DEA
时间: 2024-02-14 20:36:02 浏览: 56
这是一个基于数据包络分析(Data Envelopment Analysis,DEA)的类,可以计算相对效率和权重。其中,相对效率是指通过比较不同输入输出变量组合下的效率,得出某个组合与其他组合的相对效率值;权重是指通过计算输入输出变量间的距离和效率,得出每个数据点的权重值。在该类中,计算距离采用欧几里得距离公式,计算相对效率和权重的具体方法分别为efficiency和calculateWeights。
相关问题
template <typename T, typename U> static void convert(const std::vector<std::vector<T>>& inputs, std::vector<std::vector<U>>* outputs) { outputs->reserve(inputs.size()); std::transform(inputs.begin(), inputs.end(),outputs->back, [](const std::vector<T>& p, std::vector<U>* q) { return convert(p, q); }); }
这是一个 C++ 的函数模板,用于将一个二维的元素类型为 T 的向量 inputs 转换为元素类型为 U 的向量 outputs。函数中使用了 lambda 表达式和 STL 算法 transform()。
具体来说,函数首先通过 reserve() 函数为输出向量 outputs 分配足够的内存,以避免多次动态地分配空间。然后,使用 STL 算法 transform() 对输入向量 inputs 进行转换,并将结果存储在输出向量 outputs 中。在 transform() 函数中,使用了一个 lambda 表达式,该表达式将每个输入向量 p 转换为一个输出向量 q,并返回结果。其中,convert() 是另一个函数模板,用于将元素类型为 T 的向量转换为元素类型为 U 的向量。
需要注意的是,调用该函数时,需要传递一个指向输出向量的指针,该指针指向的向量需要在调用之前已经被创建并分配足够的空间。
怎么理解std::vector<cv::Mat> inputs{matRGBScaled}
这段代码是使用C++中的标准库std::vector来创建一个向量(vector)对象,并初始化它的元素为一个cv::Mat对象。
具体地说,std::vector<cv::Mat> inputs表示创建了一个名为inputs的向量,其中的元素类型为cv::Mat,即OpenCV库中的图像矩阵类型。
初始化部分{matRGBScaled}表示向inputs中添加了一个元素,该元素的值为matRGBScaled。在这里,matRGBScaled是一个cv::Mat对象,可能是一个已经加载或创建的图像矩阵。
这样的初始化方式允许你在创建vector对象时直接指定初始元素,而不需要单独调用push_back()等函数添加元素。
需要注意的是,std::vector是一个动态数组,可以存储多个元素,并且具有自动调整大小的功能。因此,你可以在inputs中添加更多的cv::Mat对象,以便处理多个图像矩阵。
阅读全文