首页 > 解决方案 > 与犰狳/C++ 中矩阵的非连续子集共享内存

问题描述

嗨,以下是可能的,如果是这样,关于如何做到这一点的任何提示?

这是我想要实现的虚拟版本:定义三个矩阵 A、B 和 C,A_xy 标准正态分布,B_xy = A_xy 表示 A_xy > 0,否则为 0。同样,对于 A_xy <= 0,C_xy = A_xy,否则为 0。

为了避免复制操作,我想构造 B 和 C 使得非零元素与 A 共享内存。这甚至可能吗?!如果我以稀疏矩阵格式构造 B 和 C,那么我不需要担心不会共享内存的额外零,但这可能最终会变慢,具体取决于 B 和 C 的稀疏性......

在下面的 B 和 C 显然不与 A 共享内存,但应该给出我想要做什么的想法:

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

不是我想要的,但希望你能明白!

谢谢!

标签: c++armadillo

解决方案


推荐阅读