【问题标题】:Assignment of arrays in C++ like Matlab?像 Matlab 一样在 C++ 中分配数组?
【发布时间】:2023-04-01 07:30:01
【问题描述】:

所以在MATLAB 中,如果我创建一个N x N x N x N x 6 维矩阵,我可以将值分配给6 个一组的矩阵,如下所示:

myMatrix(1,1,1,1,:) = [69, 3, 864, 21, 95, 20];

是否有类似的方法可以在 C++ 中以 6 个为一组写入 N x N x N x N x 6 维矩阵?

另外,有没有类似的方法来设置 6 个元素等于另外 6 个元素,即 myArray(N,N,N,8,:) = myArray(N,N,N,6,:)?

(请不要使用 std::vector 解决方案 - 需要将矩阵保持为数组形式,因为现有代码是使用 c++/CUDA 为数组构建的,并且非常复杂)

【问题讨论】:

标签: c++ arrays matlab matrix cuda


【解决方案1】:

#include <algorithm>,你可以使用std::copy

int myMatrix[N][N][N][N][6];
const int src[6] = {69, 3, 864, 21, 95, 20};

std::copy(std::begin(src), std::end(src), myMatrix[0][0][0][0]);

所以myArray(N,N,N,8,:) = myArray(N,N,N,6,:) 的等价物是:

std::copy(std::begin(myMatrix[N-1][N-1][N-1][5]),  // Source start
          std::end(myMatrix[N-1][N-1][N-1][5]),    // Source end
          std::begin(myMatrix[N-1][N-1][N-1][7])); // Dest start

请注意,C/C++ 中的索引从 0 开始,而不是在 1

【讨论】:

  • 太棒了。抱歉第二个问题,但我如何使用此方法将 6 个元素设置为等于另外 6 个元素即 myArray(N,N,N,8,:) = myArray(N,N,N,6,:)
  • 已编辑以添加您的其他问题的解决方案。
  • src[6] 需要是 const int 类型吗?我可以让它只是 int 吗?
  • 可能不是const
  • src 可能是一个float 数组,但如果myMatrix 是一个int 矩阵,您将有一个floatint 的转换。
【解决方案2】:

您可以像在 matlab 中一样分配: 假设你有一个向量:

std::vector<std::vector<std::vector<std::vector<std::vector<int>>>>>> myVector;

假设它已像这样正确初始化:

myVector(N, std::vector<std::vector<std::vector<std::vector<int>(N, std::vector<std::vector<std::vector<int>(N, std::vector<std::vector<int>(N, std::vector<int>(6, 0)))));

毛。尝试以不同的方式进行操作或使用 push_back 以使其有意义。

但是,无论你怎么做,你都可以像这样分配最低级别的向量:

std::vector<int> yourTempVector(6, someNumber);
myVector[1][1][1][1] = yourTempVector;

【讨论】:

  • 我不能在我的程序中使用 std::vectors 因为我实际上使用的是禁止这些结构的 CUDA/C++ :(
  • @Jordan Cuda 不能使用stl 类型?一定要用数组吗?
  • 我不知道 stl 是什么,但我真的更喜欢使用数组,因为这意味着对已经非常复杂的程序进行最少的重组。
  • stl 类型是标准的 c++ 库类型,如 vectormap,基本上是使 c++ 变得更好的原因。您可以使用CUDA 特定类型,如下所示:docs.nvidia.com/cuda/thrust/#axzz35ip8zUwF
  • 谢谢 Ben,我会把它作为 B 计划。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多