gpt4 book ai didi

c++ - 逐列复制 C/C++ 数组

转载 作者:行者123 更新时间:2023-11-30 19:57:57 24 4
gpt4 key购买 nike

我有各种存储矩阵的文本文件。我可以根据需要读入并保存它们。但是,在某些情况下我想丢弃矩阵的列。我可以通过嵌套循环来做到这一点,但我认为应该有一种方法可以使用 memcpy 来做到这一点或类似的东西。这是一个例子:

#include <string.h>

using namespace std;

int main(){

int a1[4][3];

int count(0);

for (int i = 0; i < 4; ++i){
for (int j = 0; j < 3; ++j){
a1[i][j] = count;
++count;
}
}

int a2[4][2];

memcpy(a2, a1, sizeof(int) * 8);

int a3[4][2];
int *t = &a1[0][1];
memcpy(a3, t, sizeof(int) * 8);

return 0;
}

由于数组存储为行主 memcpy a2的结果和a3是整数 0-71-8分别。我想要的是一种获取整数的方法

0 1
3 4
6 7
9 10

相反。这些是 a1 的前 2 列。如果我定义 aTransposed[3][4] 我可以做到这一点并将其用作:

int aTransposed[3][4];
for (int i = 0; i < 3; ++i){
for(int j = 0; j < 4; ++j){
aTransposed[i][j] = a1[j][i];
}
}
memcpy(a2, aTransposed, sizeof(int) * 8);

a2将包含正确的值,但位置错误。

我的问题是如何在不使用循环的情况下将一个数组中的任何给定列复制到另一个数组中? C 或 C++ 解决方案都可以。尽量避免使用额外的库,例如 Eigen 或 Boost。

编辑对于那些对 C/C++ 标签感兴趣的人。其中没有什么内容一定是 C 或 C++ 的。无论哪种方式都会起作用。是的,我写的代码片段是用 C++ 编写的,但用任何一种语言都可以轻松完成。我正在尝试在任何一种语言中找到解决方案。因此这两个标签。

最佳答案

对象的内存布局声明为:

int a1[4][3];

|                   a1                          |

| a1[0] | | a1[3] |
+---+---+---+---+---+---+---+---+---+---+---+---+
| | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+

对象的内存布局声明为:

int a2[4][2];

|              a2               |

| a2[0] | | a2[3] |
+---+---+---+---+---+---+---+---+
| | | | |
+---+---+---+---+---+---+---+---+

定义a1第三列的元素是:

+---+---+---+---+---+---+---+---+---+---+---+---+
| x | x | x | x |
+---+---+---+---+---+---+---+---+---+---+---+---+

定义a2第二列的元素是:

+---+---+---+---+---+---+---+---+
| x | x | x | x |
+---+---+---+---+---+---+---+---+

由于定义列的元素不在连续内存中,因此您无法使用 memcpy 将列从 a1 复制到 a2。使用循环是将列从 a1 复制到 a2 的唯一方法。

关于c++ - 逐列复制 C/C++ 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com