如何将列向量转换为 MxN 矩阵?

Posted

技术标签:

【中文标题】如何将列向量转换为 MxN 矩阵?【英文标题】:How to convert column vector into MxN matrix? 【发布时间】:2014-02-17 08:30:37 【问题描述】:

我对 C++ 比较陌生,并且有点陷入这个问题。我有 999x1 点坐标向量,我想将其动态转换为 333x3 矩阵。除此之外,我为一个项目使用不同的 Cpp 文件,因此读取点集的函数位于不同的文件中。如何制作这个矩阵以及我应该如何在我的主代码中访问它? 我尝试使用 vector<vector<float> > Mymatrix 的东西,但您需要在这种定义中指定行和列大小,直到我阅读文件才能得到。如果我尝试在读取点集文件的函数中声明上面的 Mymatrix 变量,它的范围会受到限制,我不能在 main.cpp 中使用该 Mymatrix。 在这里编写代码有点困难,因为它与其他文件有很多链接。我希望你有我的问题!请在这个问题上帮助我...提前致谢!

【问题讨论】:

避免“文字墙”帖子 vector可以动态增长,为什么在这种定义中需要指定行列大小呢? 【参考方案1】:

vector 实际上只是一个数组的容器。所以基本上你有一个int A[999] 并想把它转换成int M[333][3]; 考虑到在内存中,一维数组和二维数组都存储在一个连续的内存区域中,您可以通过多种方式实现这一点:

 - use a pointer and two indexes i, j: the first 3 elements are your first row,
   the next 3 elements your second row and so on.

int vector<int> v;
int *p, i=0,j=0;  // i=[0..332], j=[0..2]
p=&v[0];
*(p+(i*3)+j); //this is the same as p[i][j];

或声明矩阵(为它分配静态或动态内存)并将所有元素复制到矩阵中:

int M[333][3]; //i'll go with static allocation for this example
for(i=0;i<333;i++)
   for(j=0;j<3;j++)
      M[i][j] = v[i*3 + j];

选择您想要的任何一种方法 - 第一种方法的优点是它不会占用额外的内存。

【讨论】:

谢谢!后来我自己想通了。我使用的技术与您的第二种方法完全相同。静态分配。我还声明了矩阵类型的函数并在最后返回了一个矩阵以使用不同的文件。 :) 还是谢谢! 请为您收到的任何有用的 cmets 或答案投票 :)【参考方案2】:

您可以将 MyMatrix 创建为指针并作为参数传递给您的函数:

vector<vector<float> >* Mymatrix; //Don't forget to initialize the pointer
functionThatReadsFiles(Mymatrix); //That function makes changes to Mymatrix

这样,您在“functionThatReadsFiles”中对 Mymatrix 所做的任何更改都将在其调用后保留。无论如何,在尝试之前,请确保您完全了解如何使用指针进行操作。

正如@erlc 所说,您还可以使用以下方式声明您的函数:

void functionThatReadsFiles(vector<vector<float> >& Mymatrix);

并且调用只是正常调用它(没有指针),并且更改将再次保留在您的 Mymatrix 中。

【讨论】:

这只是这个问题可能有的多种解决方案之一。绝对存在另一种解决方案不是我反对的理由。 你还在用指针参数,为什么不把参数改成引用void functionThatReadsFiles(vector &amp;) 嗯,对不起,你是对的。这就是我编辑太快的原因。

以上是关于如何将列向量转换为 MxN 矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

matlab里如何把一个矩阵相同列向量的列序号依次输出出来?

matlab中如何用qr函数求特征值和特征向量,矩阵是mxn

如何将向量转换为犰狳矩阵?

如何将矩阵转换为 R 中的列向量列表?

在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?

如何将两列“计数”矩阵转换为 R 中的二进制向量? [复制]