c++ - 与犰狳/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
不是我想要的,但希望你能明白!
谢谢!
解决方案
推荐阅读
- java - 在 spark 中查找数据的最佳选择
- angular - 访问嵌套 FormArray 中的 FormControl 值
- r - 函数和循环中的 kable
- python - 使用 Python 和 xlwings 在 Excel 中查找活动/选定单元格的范围 - 续
- mysql - 使用子查询的报价总和
- arrays - 计数内部数组猫鼬
- mysql - LEFT JOIN 一些值返回为 NULL
- c++ - C++:如何将 unix 时间的字符串转换为 *tm?(使用 strptime 时出错:“无法将 'String' 转换为 'tm*'”)
- delphi - 如何过滤主从网格
- python - “_('foo')”在 Python 中是什么意思?