使用block()在分配中使用block()缩小矩阵
Shrink matrix with Eigen using block() in assignment
我有以下代码,通过删除最后一行来缩小特征MATRIXXD。无论如何,这似乎破坏了矩阵。Valgrind也对该代码感到非常沮丧。执行该任务的正确方法是什么?
#include <Eigen/Core>
#include <iostream>
int main() {
Eigen::MatrixXd A(3, 4);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
A(i, j) = i * j + i + j + 5;
std::cout << "A = n" << A << std::endl;
A = A.block(0, 0, 2, 4);
std::cout << "A = n" << A << std::endl;
return 0;
}
此代码在我的计算机上产生以下输出(注意5变为0)
A =
5 6 7 8
6 8 10 12
7 10 13 16
A =
0 6 7 8
6 8 10 12
Eigen::Block<...>
( block()
成员函数返回)不做涉及的值的副本,而是作为对矩阵的一部分的引用。您可以用
A.block(0, 0, 2, 4) *= 2; // this will change A
因此,只要基础矩阵不重新安置其值,Eigen::Block
对象就保持有效,如果您为其分配了不同的几何形状(例如A.block(0, 0, 2, 4)
),则该值将其有效。一旦基础矩阵发布了其预分配内存,使用Block
对象构成了无用的使用,并导致不确定的行为,并且分配运算符当然会尝试从当时已灭绝的Block
。P>
正如您在此期间发现的那样,您可以使用
A.conservativeResize(2, 4);
对于您的特定情况,因为您想向左上角收缩。对于一般情况,您可以使用(例如)
A = A.block(1, 1, 2, 3).eval();
.eval()
迫使立即强制进行懒惰评估,在这种情况下,这实际上意味着制作块的临时副本,然后分配给矩阵。有关所有这些的更多详细信息,请参见特征文档。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 我无法缩小此分段错误的原因
- 将stl字符串缩小到小于15个字符的容量
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 为什么显式构造被视为(隐式)缩小转换?
- 为什么C++在将浮点数转换为字符时没有显示缩小转换错误?
- glpointsize() 无法缩小点
- 根据帧速率缩放/缩小数字
- 为什么我需要在以下示例中在 block_cache.h 之前包含 block_cache_key.h 和 block.h
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- 错误:在 { } [-缩小] 中将"199"从"int"到"char&
- C(嵌入式):注释 FreeRTOS 的 RootTask 时代码大小不会缩小
- 缩小从double到float的转换
- 如何定义此"if block"中其他无效输入的值,以便在c ++中将字符串转换为对象?
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- 使用block()在分配中使用block()缩小矩阵