Armadillo C++:如何使用来自另一个矩阵的多个元素修改矩阵的多个数组元素,特别是在立方体结构中?

Posted

技术标签:

【中文标题】Armadillo C++:如何使用来自另一个矩阵的多个元素修改矩阵的多个数组元素,特别是在立方体结构中?【英文标题】:Armadillo C++: How to modify multiple array elements of a matrix using multiple elements from another matrix, specifically in a cube structure? 【发布时间】:2017-03-01 12:23:11 【问题描述】:

在 MATLAB 中,如果我有两个 3x3 矩阵 A 和 B,并且想将 B 的最后两列复制到 A 的前两列,我将使用以下语法:

A(:,1:2) = B(:,2:3)

我正在尝试使用 C++ 中的犰狳完成相同的操作,特别是针对立方体结构。在犰狳中,如果我有两个具有九个切片的立方体 A 和 B(每个切片是一个 3x3 矩阵),我假设我会使用以下内容来执行相同的列元素更新:

A(span(0,2),span(0,1),span(i)) = B(span(0,2),span(1,2),span(i))

其中 'i' 只是切片索引。语法基于犰狳语法指南。

代码编译无误并运行;立方体切片只是没有被更新。我在这里使用了正确的犰狳语法吗?这是执行这些操作的最有效方式吗?

【问题讨论】:

您的代码实际上无法编译。您使用了错误的 subcube 语法。将i 替换为span(i,i)span::all。第一种形式更新一个切片。第二种形式更新所有切片。 @hbrerkere 啊,有道理,谢谢。代码正在编译,因为我有span(i) 而不是i,正如我之前在问题中指定的那样。我会更新问题以提及这一点。 语法现在看起来。根据我的测试,这是可行的。它将相关部分从B 复制到A。您确定代码中的其他地方没有错误吗? @hbrerkere 你是对的,这种语法确实有效。毕竟代码中存在错误。我使用了不正确的索引,并不是所有的元素都被复制了,所以语法不是问题。我很高兴为了清楚起见,我询问了所有相同的语法。感谢您对此的帮助,不胜感激。 【参考方案1】:

如果您想要简单的复制/粘贴(而不是立方体矩阵的移位/旋转),您可以使用以下语法来解决问题:

#include <armadillo>

int main (int argc, char* argv[])

    size_t num_slices = 9;

    arma::icube A (3, 3, num_slices);
    arma::icube B (3, 3, num_slices);

    A.zeros();
    B.randn();

    A.print("Cube A :\n");
    B.print("Cube B :\n");

    for (int s = 0; s < num_slices; ++s)
        A.slice(s)(arma::span::all, arma::span(0, 1)) = 
        B.slice(s)(arma::span::all, arma::span(1, 2));

    A.print("Cube A :\n");
    B.print("Cube B :\n");

    return 0;

【讨论】:

以上是关于Armadillo C++:如何使用来自另一个矩阵的多个元素修改矩阵的多个数组元素,特别是在立方体结构中?的主要内容,如果未能解决你的问题,请参考以下文章

armadillo C++ 矩阵库——如何启用 ATLAS 或 LAPACK?

armadillo C++:从数组初始化矩阵

使用 Armadillo C++ 加载稀疏矩阵

C++ Armadillo 和 OpenMp:外积求和的并行化 - 定义 Armadillo 矩阵的约简

armadillo c++:将矩阵的每一行乘以向量的有效而简洁的方法?

在 C++ 中返回多个矩阵(犰狳库)