gpt4 book ai didi

c++ - 特征矩阵的就地元素类型转换

转载 作者:行者123 更新时间:2023-11-28 05:02:17 25 4
gpt4 key购买 nike

我想将整数矩阵转换为浮点矩阵,这样:

  1. 数据未被复制。
  2. 没有分配新内存
  3. 数据的新浮点 View 是可变的。

最新尝试:

#include "Eigen/Eigen"
#include <iostream>
int main(){
using namespace Eigen;
MatrixXi x(3,3);
x.fill(0);
double* ptr_x = (double*)(x.data());
Map<MatrixXd> y(ptr_x, x.rows(), x.cols());
x(0,0) = 100;
y = x.cast<double>();
y(1,1) = 0.5f;
std::cout << y << "\n";
}

运行时错误:

a.out: malloc.c:2405: 

sysmalloc:
Assertion `(old_top == initial_top (av) && old_size == 0)
|| ((unsigned long) (old_size) >= MINSIZE
&& prev_inuse (old_top)
&& ((unsigned long) old_end & (pagesize - 1)) == 0)'
failed.

Aborted (core dumped)

以下不编译:

#include "Eigen/Eigen"
#include <stdint.h>

#include <iostream>
int main(){
using namespace Eigen;
MatrixXi x(3,3);
x.fill(0);
float* ptr_x = (float*)(x.data());

Map<MatrixXd> y(ptr_x, x.rows(), x.cols());
x(0,0) = 100;
y(1,1) = 0.5f;
y = x.cast<float>();
std::cout << y << "\n";
}

我猜 CastXpr<NewType>::Type可能有效( documentation )。但我不知道如何使用它。

CastXpr 似乎是一个 unaryExpr : How do I in-place modify each element of a 1D Array?

最佳答案

首先,您不能将其转换为 double(不分配更多空间)矩阵,因为 double 在内存中是 8 个字节,而 int 是 4 个字节。

我认为您可以简单地将浮点指针转换为原始矩阵。以下代码对我有用。

#include "Eigen/Eigen"
#include <iostream>
int main()
{
using namespace Eigen;
MatrixXi x(3, 3);
x.fill(2);
MatrixXf* float_ptr = (MatrixXf*) &x;
float_ptr->operator()(2,2) = 42.1f;

std::cout << "float cast(2,2): " <<
float_ptr->operator()(2, 2) << std::endl;
std::cout << "float cast(1,1): " <<
float_ptr->operator()(1, 1) << std::endl;
std::cout << "x(1,1): " << x(1, 1) << std::endl;
}

输出:

float cast(2,2): 42.1
float cast(1,1): 2.8026e-45 (which is ~2)
x(1,1): 2
Press any key to continue . . .

所以...只要您使用此指针,分配的对象就会充当浮点矩阵,但请记住,您不能将“x”用作浮点矩阵,因为任何函数调用都使用'x' 将导致分配的内存被解释为整数矩阵

例如:由于我们已将原始 (2,2) 从 int 更改为 float,如果您尝试使用 'x' 检索它,您将看到类似这样的内容。

    .
.
.
std::cout << "float cast(2,2): " <<
float_ptr->operator()(2, 2) << std::endl;
std::cout << "x(2,2): " << x(2, 2) << std::endl;

输出:

float cast(2,2): 42.1
x(2,2): 1109943910

关于c++ - 特征矩阵的就地元素类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622613/

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