C++ 与Armadillo/C+中矩阵的非连续子集共享内存+;
您好,以下是可能的,如果是的话,如何做的任何提示C++ 与Armadillo/C+中矩阵的非连续子集共享内存+;,c++,armadillo,C++,Armadillo,您好,以下是可能的,如果是的话,如何做的任何提示 这是我想要实现的一个虚拟版本:定义三个矩阵a、B和C,其中a_xy标准正态分布,B_xy=a_xy表示a_xy>0,否则为0。同样地,C_xy=A_xy表示A_xy在犰狳中是不可能的。但这在Eigen中是可能的。犰狳子矩阵视图通常通过复制操作,特征子矩阵视图是指向原始对象的指针。差别很大。您也可以通过使用std::vector映射指针数组来实现这一点,但是您最好知道自己在做什么,并且不再利用连续内存(这可能会导致性能下降)。当我遇到这种情况时,我
这是我想要实现的一个虚拟版本:定义三个矩阵a、B和C,其中a_xy标准正态分布,B_xy=a_xy表示a_xy>0,否则为0。同样地,C_xy=A_xy表示A_xy在犰狳中是不可能的。但这在Eigen中是可能的。犰狳子矩阵视图通常通过复制操作,特征子矩阵视图是指向原始对象的指针。差别很大。您也可以通过使用std::vector映射指针数组来实现这一点,但是您最好知道自己在做什么,并且不再利用连续内存(这可能会导致性能下降)。当我遇到这种情况时,我通常倾向于复制到B或C,运行我的计算,然后将结果映射回A。这样,在运行操作时,我就可以在B和C中获得连续内存查找的性能优势,而将其映射回A只不过是对已分配内存的简单复制。@zdebruine查看Armadillo源代码,子矩阵视图尽可能引用原始对象。@hbrekere我已更正!不过,在非连续子矩阵引用上执行大量计算可能比在副本上执行相同操作然后更新原始对象要慢。
arma_rng::set_seed(1);
mat A;
A.randn(4,4);
uvec indB = find(A > 0);
uvec indC = find(A <= 0);
// Copy construction
mat B, C;
B.zeros(4,4);
B.elem(indB) = A.elem(indB);
C.zeros(4,4);
C.elem(indC) = A.elem(indC);
A.print("A");
B.print("B");
C.print("C");
A
-0.3868 -0.7951 0.1175 -1.5241
-0.0394 -0.0546 -0.8588 -0.4954
0.6868 1.9379 -0.6483 0.9138
-0.2489 1.0010 0.6746 -0.6272
B
0 0 0.1175 0
0 0 0 0
0.6868 1.9379 0 0.9138
0 1.0010 0.6746 0
C
-0.3868 -0.7951 0 -1.5241
-0.0394 -0.0546 -0.8588 -0.4954
0 0 -0.6483 0
-0.2489 0 0 -0.6272
// Auxiliary memory construction
mat B2(vec (A.elem(indB)).memptr(), A.n_rows, A.n_cols, false, true);
B2.print("B2");
B2
6.8682e-01 6.7457e-01 4.6573e-310 4.6573e-310
1.9379e+00 9.1377e-01 6.9257e-310 6.9257e-310
1.0010e+00 4.6573e-310 4.6573e-310 4.6573e-310
1.1752e-01 6.9257e-310 6.9257e-310 6.9257e-310