EIGEN:一次性复制多个行列数据

实现类比于MATLAB的行列操作

即:提取指定行列,或删除指定行列
A(:,index1:index2);或A(:,[index1,index2,...,indexn]);
A(index1:index2,:);或A([index1,index2,...,indexn],:);
A(:,index1:index2)=[];或A(:,[index1,index2,...,indexn])=[];
A(index1:index2,:)=[]或A([index1,index2,...,indexn],:)=[];
#include<iostream>
#include<algorithm>
#include<Eigen/Eigen>
using namespace std;
using namespace Eigen;

class Extra_Del
{
public:
	MatrixXd rows_ext_V(VectorXi ind, MatrixXd matrix);
	MatrixXd rows_ext_M(MatrixXd ind, MatrixXd matrix);
	MatrixXd cols_ext_V(VectorXi ind, MatrixXd matrix);
	MatrixXd cols_ext_M(MatrixXd ind, MatrixXd matrix);
	MatrixXd rows_del_V(VectorXi ind, MatrixXd matrix);
	MatrixXd rows_del_M(MatrixXd ind, MatrixXd matrix);
	MatrixXd cols_del_V(VectorXi ind, MatrixXd matrix);
	MatrixXd cols_del_M(MatrixXd ind, MatrixXd matrix);
};
MatrixXd Extra_Del::rows_ext_V(VectorXi ind, MatrixXd matrix){//行提取**********
	MatrixXd zs1(ind.size(), 1);
	zs1 << (ind.head(ind.size())).cast<double>();
	MatrixXd final_matrix(zs1.size(), matrix.cols());
	int num = zs1.size();
	for (int k = 0; k < num; k++)
	{
		final_matrix.row(k) = matrix.row(zs1(k, 0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::rows_ext_M(MatrixXd ind, MatrixXd matrix){//行提取**********
	MatrixXd final_matrix(ind.size(), matrix.cols());
	int num = ind.size();
	for (int k = 0; k < num; k++)
	{
		final_matrix.row(k) = matrix.row(ind(k,0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::rows_del_V(VectorXi ind, MatrixXd matrix){//行取反删除**********
	double num=matrix.rows();
	VectorXd xl(num);
	for (int i = 0; i < num; i++)
	{
		xl(i) = i;
	}
	for (int i = 0; i < ind.size(); i++)
	{
		xl(ind(i)) = NAN;
	}
	VectorXd out_index(num - ind.size());
	int index(0);
	for (int i = 0; i < num; i++){
		if (isnan(xl(i)))
		{
			continue;
		}
		else
		{
			out_index(index) = i;
		}
		index++;
	}
	MatrixXd zs1(out_index.size(), 1);
	zs1 << (out_index.head(out_index.size())).cast<double>();
	MatrixXd final_matrix(zs1.size(), matrix.cols());
	int num1 = zs1.size();
	for (int k = 0; k < num1; k++)
	{
		final_matrix.row(k) = matrix.row(zs1(k, 0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::rows_del_M(MatrixXd ind, MatrixXd matrix){//行取反删除**********
	double num = matrix.rows();
	VectorXd xl(num);
	for (int i = 0; i < num; i++)
	{
		xl(i) = i;
	}
	for (int i = 0; i < ind.size(); i++)
	{
		xl(ind(i)) = NAN;
	}
	VectorXd out_index(num - ind.size());
	int index(0);
	for (int i = 0; i < num; i++){
		if (isnan(xl(i)))
		{
			continue;
		}
		else
		{
			out_index(index) = i;
		}
		index++;
	}
	MatrixXd zs1(out_index.size(), 1);
	zs1 << (out_index.head(out_index.size())).cast<double>();
	MatrixXd final_matrix(zs1.size(), matrix.cols());
	int num1 = zs1.size();
	for (int k = 0; k < num1; k++)
	{
		final_matrix.row(k) = matrix.row(zs1(k, 0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::cols_ext_V(VectorXi ind, MatrixXd matrix){//列提取*********
	MatrixXd zs1(ind.size(), 1);
	zs1 << (ind.head(ind.size())).cast<double>();
	MatrixXd final_matrix(matrix.rows(), zs1.size());
	int num = zs1.size();
	for (int k = 0; k < num; k++)
	{
		final_matrix.col(k) = matrix.col(zs1(k, 0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::cols_ext_M(MatrixXd ind, MatrixXd matrix){//列提取*********
	MatrixXd final_matrix(matrix.rows(), ind.size());
	int num = ind.size();
	for (int k = 0; k < num; k++)
	{
		final_matrix.col(k) = matrix.col(ind(k, 0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::cols_del_V(VectorXi ind, MatrixXd matrix){//行取反删除**********
	double num = matrix.rows();
	VectorXd xl(num);
	for (int i = 0; i < num; i++)
	{
		xl(i) = i;
	}
	for (int i = 0; i < ind.size(); i++)
	{
		xl(ind(i)) = NAN;
	}
	VectorXd out_index(num - ind.size());
	int index(0);
	for (int i = 0; i < num; i++){
		if (isnan(xl(i)))
		{
			continue;
		}
		else
		{
			out_index(index) = i;
		}
		index++;
	}
	MatrixXd zs1(out_index.size(), 1);
	zs1 << (out_index.head(out_index.size())).cast<double>();
	MatrixXd final_matrix(matrix.rows(), zs1.size());
	int num1 = zs1.size();
	for (int k = 0; k < num1; k++)
	{
		final_matrix.col(k) = matrix.col(zs1(k, 0));
	}
	return final_matrix;
}
MatrixXd Extra_Del::cols_del_M(MatrixXd ind, MatrixXd matrix){//行取反删除**********
	double num = matrix.rows();
	VectorXd xl(num);
	for (int i = 0; i < num; i++)
	{
		xl(i) = i;
	}
	for (int i = 0; i < ind.size(); i++)
	{
		xl(ind(i)) = NAN;
	}
	VectorXd out_index(num - ind.size());
	int index(0);
	for (int i = 0; i < num; i++){
		if (isnan(xl(i)))
		{
			continue;
		}
		else
		{
			out_index(index) = i;
		}
		index++;
	}
	MatrixXd zs1(out_index.size(), 1);
	zs1 << (out_index.head(out_index.size())).cast<double>();
	MatrixXd final_matrix(matrix.rows(), zs1.size());
	int num1 = zs1.size();
	for (int k = 0; k < num1; k++)
	{
		final_matrix.col(k) = matrix.col(zs1(k, 0));
	}
	return final_matrix;
}

主函数:

#include<iostream>
#include<algorithm>
#include<Eigen/Eigen>
#include"Extra_Del.h"
using namespace std;
using namespace Eigen;

int main(){
	MatrixXd ind(3,1);
	Matrix <double, 5, 5, RowMajor>matrix;
	matrix << 1, 2, 3, 4, 5,
		4, 5, 6, 7, 8,
		7, 5, 4, 5, 2,
		1, 4, 7, 8, 5,
		1, 2, 3, 6, 5;
	ind << 1, 2, 3;
	MatrixXd bb;
	Extra_Del aa;
	cout << "原矩阵-------------------------------" << endl;
	cout << "提取的索引为" << ind(0) << " " << ind(1) << " " << ind(2) << "-----"<<endl;
	cout << matrix << endl;
	cout << "提取对应行-------------------------------" << endl;
	bb = aa.rows_ext_M(ind, matrix);
	cout << bb << endl;
	cout << "提取对应列-------------------------------" << endl;
	bb = aa.cols_ext_M(ind, matrix);
	cout << bb << endl;
	cout << "删除对应行-------------------------------" << endl;
	bb = aa.rows_del_M(ind.transpose(), matrix);
	cout << bb << endl;
	cout << "删除对应列-------------------------------" << endl;
	bb = aa.cols_del_M(ind, matrix);
	cout << bb << endl; 
	return 0;
	
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值