C++ 将平面阵列整形为复本征型

C++ 将平面阵列整形为复本征型,c++,eigen,C++,Eigen,如何将大小为1×2N的data重塑为复数形式,将其特征值转化为形式ap×Q复数矩阵,并使用N复数,p×Q=N?在数据中,实部和虚部紧挨着。我想动态地重塑数据,因为数据可以有不同的大小。我试图阻止复制,只是将数据映射到复杂类型 int N = 9; int P = 3; int Q = 6; float *data = new float[2*N]; for(int i = 0; i < 2*N; i++) data[i] = i + 1; // data = {1, 2, 3, 4

如何将大小为
1×2N
data
重塑为复数形式,将其特征值转化为形式a
p×Q
复数矩阵,并使用
N
复数,
p×Q=N
?在
数据中
,实部和虚部紧挨着。我想动态地重塑
数据
,因为数据可以有不同的大小。我试图阻止复制,只是将数据映射到复杂类型

int N = 9;
int P = 3;
int Q = 6;
float *data = new float[2*N];
for(int i = 0; i < 2*N; i++)
    data[i] = i + 1; // data = {1, 2, 3, 4, ..., 17, 18};

Eigen::Map<Eigen::MatrixXcf> A(data, P, Q); // trying to have something like this.

// Desired reshaping:
// A = [
//      1 + 2i     7 + 8i     13 + 14i
//      3 + 4i     9 + 10i    15 + 16i
//      5 + 6i    11 + 12i    17 + 18i
//      ]
Eigen::Map
中的
stride
是否有帮助

最简单的解决方案是循环所有元素,并将
数据
转换为
std::complex*datac=new std::complex[N]的数组。我想知道Eigen能否将
数据
映射到
数据C
。提前感谢。

以下是MCVE答案()以及一些额外示例,说明如何使用步幅获得不同的结果:

#include "Eigen/Core"
#include <iostream>
#include <complex>

int main()
{
    int N = 9;
    int P = 3;
    int Q = 6;
    float *data = new float[20*N];
    for(int i = 0; i < 20*N; i++)
        data[i] = i + 1; // data = {1, 2, 3, 4, ..., 170, 180};

    // Produces the output of the "Desired reshaping"
    Eigen::Map<Eigen::MatrixXcf> 
               A((std::complex<float>*)(data), P, P);
    std::cout << A << "\n\n";

    // Produces what you originally wrote (plus a cast so it works)
    Eigen::Map<Eigen::MatrixXcf>
               B((std::complex<float>*)(data), P, Q);
    std::cout << B << "\n\n";

    // Start each column at the 10xJ position
    Eigen::Map<Eigen::MatrixXcf, 0, Eigen::OuterStride<>> 
               C((std::complex<float>*)(data), P, Q, Eigen::OuterStride<>(10));
    std::cout << C << "\n\n";

    // Skip every other value
    Eigen::Map<Eigen::MatrixXcf, 0, Eigen::InnerStride<>> 
               D((std::complex<float>*)(data), P, Q, Eigen::InnerStride<>(2));
    std::cout << D << "\n\n";

    delete [] data;
    return 0;
}
#包括“本征/核心”
#包括
#包括
int main()
{
int N=9;
int P=3;
int Q=6;
浮动*数据=新浮动[20*N];
对于(int i=0;i<20*N;i++)
data[i]=i+1;//data={1,2,3,4,…,170,180};
//生成“所需整形”的输出
特征::映射
A((标准::复合物*)(数据),P,P);
std::cout以下是MCVE答案()以及一些额外的示例,说明如何使用步幅获得不同的结果:

#include "Eigen/Core"
#include <iostream>
#include <complex>

int main()
{
    int N = 9;
    int P = 3;
    int Q = 6;
    float *data = new float[20*N];
    for(int i = 0; i < 20*N; i++)
        data[i] = i + 1; // data = {1, 2, 3, 4, ..., 170, 180};

    // Produces the output of the "Desired reshaping"
    Eigen::Map<Eigen::MatrixXcf> 
               A((std::complex<float>*)(data), P, P);
    std::cout << A << "\n\n";

    // Produces what you originally wrote (plus a cast so it works)
    Eigen::Map<Eigen::MatrixXcf>
               B((std::complex<float>*)(data), P, Q);
    std::cout << B << "\n\n";

    // Start each column at the 10xJ position
    Eigen::Map<Eigen::MatrixXcf, 0, Eigen::OuterStride<>> 
               C((std::complex<float>*)(data), P, Q, Eigen::OuterStride<>(10));
    std::cout << C << "\n\n";

    // Skip every other value
    Eigen::Map<Eigen::MatrixXcf, 0, Eigen::InnerStride<>> 
               D((std::complex<float>*)(data), P, Q, Eigen::InnerStride<>(2));
    std::cout << D << "\n\n";

    delete [] data;
    return 0;
}
#包括“本征/核心”
#包括
#包括
int main()
{
int N=9;
int P=3;
int Q=6;
浮动*数据=新浮动[20*N];
对于(int i=0;i<20*N;i++)
data[i]=i+1;//data={1,2,3,4,…,170,180};
//生成“所需整形”的输出
特征::映射
A((标准::复合物*)(数据),P,P);

std::cout
P*Q
在您的示例中不等于
N
。在“期望输出”中,您只有
Q/2
列。这是有意的吗?chtz所说的。而且,您(不一定)没有在映射到
MatrixXcf
@chtz之前需要映射到
Array
。@chtz很抱歉造成混淆。我是指构成
N
复数的
2N
浮点数。@AviGinsburg请查看我对chtz关于元素数的评论。你能给我举个例子吗?我会很感激。你能创建并定位吗与你的问题无关?
P*Q
在你的例子中不等于
N
。在“期望输出”中,你只有
Q/2
列。这是故意的吗?chtz说的。而且,你(不一定)没有在映射到
MatrixXcf
@chtz之前需要映射到
Array
。@chtz很抱歉造成混淆。我是指构成
N
复数的
2N
浮点数。@AviGinsburg请查看我对chtz关于元素数的评论。你能给我举个例子吗?我会很感激。你能创建并定位吗关于你的问题?谢谢。这是互联网上写的关于本征复数的最好的例子。阿维,每当你有机会回答我的问题时,我能听听你的想法吗?@AFP对不起,这不是我的专业领域。谢谢。这是互联网上写的关于本征复数的最好的例子。阿维,你能随时告诉我你的想法吗你有机会回答我贴在这里的问题吗?@AFP对不起,这不是我的专长。