matlab:bsxfun_rdivide
功能:矩阵前(n-1)行处以第n行
c++实现:
cv::Mat bsxfun_rdivide(cv::Mat input_data) {
input_data = input_data.t();//转化成每一列除以最后一列的值
cv::Mat result;
cv::Mat lastCols = input_data.col(input_data.cols - 1);//获取最后一列
int last_col_index = input_data.cols - 1;
for (int i = 0; i < input_data.rows; i++) {
cv::Mat tmp = input_data.row(i) / (input_data.at<double>(i, last_col_index));
cv::Rect rect(0, 0, last_col_index, 1);
result.push_back(tmp(rect));
}
return result.t();
}
matlab:histcount
功能:直方图bin计数
c++实现:
std::vector<std::vector<int>> histcount(std::vector<double> input_data, std::vector<double> edges) {
std::vector<std::vector<int>> result;
std::vector<int> w(input_data.size());
std::vector<int> bins(edges.size() - 1);
for (int i = 0; i < input_data.size(); i++) {
for (int j = 0; j < edges.size() - 2; j++) {
if ((edges[j] <= input_data[i]) && (input_data[i] < edges[j + 1])) {
bins[j] = bins[j] + 1;
w[i] = j;
}
}
if ((edges[edges.size() - 2] <= input_data[i]) && (input_data[i] <= edges[edges.size() - 1])) {
bins[edges.size() - 2] = bins[edges.size() - 2] + 1;
w[i] = (int)edges.size() - 2;
}
}
result.push_back(bins);
result.push_back(w);
return result;
}
matlab:teopolitz
功能:创建teopolitz矩阵,信号统计用
c++实现
template<typename T>
cv::Mat toepolitz(std::vector<T> vector_row, std::vector<T> vector_col) {
assert(vector_col.size()>=2);
int rows = vector_row.size();
int cols = vector_col.size();
cv::Mat result = cv::Mat::zeros(cv::Size(cols, rows),CV_64FC1);
std::vector<T> x;
for (int i = 1; i < cols; i++) {
x.push_back(vector_col.at(i));
}
for (int i = 0; i < rows; i++) {
x.push_back(vector_row.at(i));
}
for (int i = 0; i < rows; i++) {
for (int j = cols - 1; j >= 0; j--) {
result.at<double>(i, cols - j - 1) = x.at(i+j);
}
}
return result;
}
matlab:reshape
功能:图像大小重定义(opencv的reshape和matlab的实现途径不一样)
c++实现:
cv::Mat reshape_matlab(cv::Mat input_data, int rows, int cols, int channels) {
assert((input_data.cols * input_data.rows * input_data.channels()) == (rows*cols*channels));
std::vector<int> shape; shape.push_back(cols); shape.push_back(rows);
input_data = input_data.t();
return input_data.reshape(channels, shape).t();
}