向量y_long_name
有100个成员,我打算只操作由前三个成员组成的子向量。 subvector
函数在我的代码中使用,如左值:
y_long_name.subvec(0,2)=A*x1;
但是C ++不会将其识别为左值。如何定义yr
代替y_long_name.subvec(0,2)
?
我想要做的是使用简短格式yr
代替y_long_name.subvec(0,2)
但不使用宏。
#include <iostream>
#include <armadillo>
int main()
{
const arma::vec::fixed<3> x1={1.2,3.5,-0.27};
arma::mat::fixed<3,3> A={{5,3,6},{8,2,11},{7,5,9}};
arma::vec::fixed<3> y1=A*x1; // ok
arma::vec::fixed<100> y_long_name;
y_long_name.subvec(0,2)=A*x1; // ok
arma::vec::fixed<3>& yr=y_long_name.subvec(0,2);
yr=A*x1;
y_long_name.print();
return 0;
}
错误:
test.cpp: In function ‘int main()’:
test.cpp:14:48: error: invalid initialization of non-const reference of type ‘arma::Col<double>::fixed<3ull>&’ from an rvalue of type ‘arma::subview_col<double>’
arma::vec::fixed<3>& yr=y_long_name.subvec(0,2)
答案 0 :(得分:1)
您仍在尝试避免在访问子视图时使用subviews。通常不建议这样做。但是,有一种不安全方法可以通过使用指向external memory指针的向量构造函数来实现此目的。例如:
vec a(10, fill::zeros);
double* a_data = a.memptr();
vec b( &a_data[5], 2, false, true ); // create 'b from part of vector 'a'
b(0) = 123.0; // changing elements in vector 'b' will also change 'a'
a.print("a:");
请注意,上面的操作是 unsafe ,因为分配给'a'使用的内存可以通过应用于'a'的任何操作来释放和重新分配。然后,向量'b'将使用指向无效内存的指针。换句话说,只有在你真正知道自己在做什么时才使用上述技巧。
答案 1 :(得分:0)
subvec
不会返回vec
;它将视图转换为原始向量,可以将其转换为临时vec
- 您无法将非const引用绑定到。{/ p>
所以你强迫yr
的错误类型,导致问题。最好不要指定它,只使用subvec
给你的类型:
auto & yr = y_long_name.subvec(0,2);
或者,因为您实际上并不需要参考:
auto yr = y_long_name.subvec(0,2);