我主要只是想找一些关于如何做到这一点的想法,而不是寻找具体的代码或类似的东西。
我正在编写一个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的常数值,因为用户输入它,我在制定算法时遇到了麻烦。
答案 0 :(得分:4)
由于您知道n
,因此任何元素都可以作为a [j * n + i]
来处理,其中i
和j
是列&行。
答案 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,祝你好运