我有各种文本文件,存储了矩阵。我可以阅读这些内容并按照我的意愿保存它们。但是,在某些情况下,我想丢弃矩阵的列。我可以通过嵌套循环来做到这一点,但我认为应该有一种方法可以用gulp.watch(['./src/**/*.js', './src/*.js'], ['js'])
或类似的东西来做到这一点。这是一个例子:
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-7
。我想要的是一种获得整数的方法
1-8
代替。这些是0 1
3 4
6 7
9 10
的前两列。如果我定义a1
并将其用作:
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);
将包含正确的值,但位置错误。
我的问题是如何在不使用循环的情况下将任何给定列或列从一个数组复制到另一个数组? C或C ++解决方案都可以。尽量避免像Eigen或Boost这样的其他库。
修改 对于那些缠绕在C / C ++标签上的人。这里没有任何东西必须是C或C ++。无论哪种方式都可行。是的,我写的代码片段是用C ++编写的,但它可以很容易地完成。我试图在任何一种语言中找到解决方案。因此两个标签。
答案 0 :(得分:5)
声明为:
的对象的内存布局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
的唯一方法。