gpt4 book ai didi

c++ - 在 Eigen 中扩展/填充矩阵

转载 作者:行者123 更新时间:2023-11-28 04:30:06 24 4
gpt4 key购买 nike

说我有

A = [1 2 3]
[4 5 6]
[7 8 9]

我想根据需要多次用第一行和第一列或最后一行和最后一列填充它以创建 A nxn。例如,A 4x4 将是

 A = [1 1 2 3]
[1 1 2 3]
[4 4 5 6]
[7 7 8 9]

A 5x5 是

 A = [1 1 2 3 3]
[1 1 2 3 3]
[4 4 5 6 6]
[7 7 8 9 9]
[7 7 8 9 9]

我知道我可以做 A.conservativeResize(4,4) 这让我着迷

 A = [1 2 3 0]
[4 5 6 0]
[7 8 9 0]
[0 0 0 0]

然后我可以一个一个地复制东西,但是有没有使用 Eigen 更有效的方法来做到这一点?

最佳答案

您可以使用 nullary 表达式解决问题:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;

int main()
{
Matrix3i A;
A.reshaped() = VectorXi::LinSpaced(9,1,9);
cout << A << "\n\n";
int N = 5;
MatrixXi B(N,N);
B = MatrixXi::NullaryExpr(N, N, [&A,N] (Index i,Index j) {
return A( std::max<Index>(0,i-(N-A.rows())),
std::max<Index>(0,j-(N-A.cols())) ); } );
cout << B << "\n\n";
}

另一种方法是创建一个固定的索引序列,如 [0 0 0 1 2]:

struct pad {
Index size() const { return m_out_size; }
Index operator[] (Index i) const { return std::max<Index>(0,i-(m_out_size-m_in_size)); }
Index m_in_size, m_out_size;
};

B = A(pad{3,N}, pad{3,N});

这个版本需要Eigen的头。

您可以轻松地在这些示例的基础上进行构建,使它们更加通用和/或将它们包装在函数中。

关于c++ - 在 Eigen 中扩展/填充矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53182368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com