转置一个写为单个向量的矩阵?

时间:2015-02-04 03:35:51

标签: c algorithm matrix transpose

我主要只是想找一些关于如何做到这一点的想法,而不是寻找具体的代码或类似的东西。

我正在编写一个C程序,其中用户输入一个n乘n矩阵,该矩阵存储为一个长向量。例如,如果矩阵是:{{0,1},{2,3}},它将被存储为:

int *a;
a = {0,1,2,3};

有没有人对我如何转换这个矩阵来做出任何想法:

a = {0,2,1,3}

显然,在2乘2矩阵的情况下这很容易,但是当涉及到n×n矩阵的情况时,我会遇到一些麻烦。

我的第一个想法是循环遍历数组并首先取出所有索引为kn + 0的元素为0< = k< = n,然后对kn + 1执行相同的操作,然后k * n + 2,依此类推,但这似乎不是一个有效的策略,因为我不知道n的值?

编辑:为了澄清,矩阵是n×n矩阵,其他输入之一是n的值。我的意思是因为我没有n的常数值,因为用户输入它,我在制定算法时遇到了麻烦。

2 个答案:

答案 0 :(得分:4)

由于您知道n,因此任何元素都可以作为a [j * n + i]来处理,其中ij是列&行。

答案 1 :(得分:2)

由于要求的是一些想法而不仅仅是代码,我想我会提出一些一般性建议来帮助得出答案。

首先,如果输入是存储为1D数组的NxN矩阵,那么您需要知道N的值才能解决问题。您对不知道N的评论意味着您的函数必须接受该值。

基本思想是循环遍历数组中的所有元素,使用(i,j)交换元素(j,i)

如果您根据如何在(i,j)找到元素来考虑它,问题就变得更容易解决。 如果矩阵的大小为NxN,则表示在输入数组中,对于每个N值(j),行增加(i)。 因此,提出用于查找任何给定元素的公式将成为列号,行号和N值的函数。

更准确地说,元素(i,j)的索引是N*i + j,行数乘以行数加上列数。

例如,在(3,2)矩阵中找到5x5处的值会产生5*3 + 2 = 17的一维数组的索引

从概念上讲,您可以通过以下示例看到:

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20 
21 22 23 24 25

作为一维数组:

{ series of integers from 1 - 25 }

如果我们想要查看此数组中(3,2) = 18元素的位置,我们会在1D数组中查找18的索引,并看到它是17。

要转置矩阵,您只需与(j,i)处的元素交换,在此示例中为(2,3) = 14

对所有N元素执行此操作的简单算法将为您提供结果。

HTH,祝你好运