用C ++切换Matrix列和行

时间:2014-12-05 22:54:34

标签: c++ arrays math matrix row

我有一个6 x 6矩阵,我将其值存储在一个大小为36的一维数组中。我想重新排列它,以便行是列,列是行。我的方法是尝试将值复制到另一个数组中,但排序正确。我正在尝试for循环:

    for (int i = 0; i < 6; ++i){
        copyArray[i]= array[i*6];
    }

这适用于第一列组成的第一个新行,但如何继续执行所有这些操作呢?我已尝试嵌套for循环但无法使用迭代器提出正确的算法。我可以手动执行此操作,但希望通过代码完成此操作。

我是用C ++编写的,但是如果有人能用类似的语言来做这件事就好了。我觉得这是一个数学问题。

问题:如何解决切换行和列的问题? (例如:如果我将第一行和第0行表示为0,则在6x6矩阵中,则行和列都从0到5。因此,通过切换行和列,第2行第5列中的值将被切换使用第5行第2列中的值。)

5 个答案:

答案 0 :(得分:2)

你不能使用嵌套的for循环并做这样的事情吗?

for (int i = 0; i < 6; ++i)
    for (int j = 0; j < 6; ++j)
        copyArray[i*6+j]= array[j*6+i];

这是您可以运行的测试程序,以显示它的工作原理:

#include <stdio.h>

int main()
{
    int array[36] = {1,1,1,1,1,1,
                     2,2,2,2,2,2,
                     3,3,3,3,3,3,
                     4,4,4,4,4,4,
                     5,5,5,5,5,5,
                     6,6,6,6,6,6};
    int copyarray[36];

    for (int i = 0; i < 6; ++i)
        for (int j = 0; j < 6; ++j)
            copyarray[i*6+j]= array[j*6+i];

    for (int i = 0; i < 36; ++i)
    {
        if (i % 6 == 0)
            printf("\n");

        printf("%d ", array[i]);

    }

    printf("\n");
    printf("\n");

    for (int i = 0; i < 36; ++i)
    {
        if (i % 6 == 0)
            printf("\n");

        printf("%d ", copyarray[i]);
    }

    return 0;
}

输出:

1 1 1 1 1 1 
2 2 2 2 2 2 
3 3 3 3 3 3 
4 4 4 4 4 4 
5 5 5 5 5 5 
6 6 6 6 6 6 


1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6

答案 1 :(得分:0)

for( int i=0;i<6;i++)
   for( int j=0;j<6;j++)
      {         }//You can do whatever you want on original matrix here

假设您想要“转置矩阵”并进行一些处理。基本上切换i和j

 for( int j=0;j<6;j++)   // replaceed i with j
   for( int i=0;i<6;i++)
      {              }//You can do whatever you want on transpose matrix here

答案 2 :(得分:0)

你应该把你的一维数组放在一个类中 然后,您可以交换数据的维度而无需实际移动它。

class MySwapableArray
{
     bool  normal;
     int   array[36];


     public:
         int& operator()(int x, int y)
         {
              int  h = normal ? x : y;
              int  v = normal ? y : x;

              return array[h*6+v];
         }
         void swapRowsAndColumns()
         {
             normal = ! normal;
         }
 };

如果您想使用{[1}},例如A [x] [y],请参阅:How to overload array index operator for wrapper class of 2D array?

答案 3 :(得分:0)

这样做的模板。

template<class X> std::unique_ptr<typename std::pointer_traits<X>::element_type[]>
transpose(const X& p, int x, int y) {
    using T = std::pointer_traits<X>::element_type;
    std::unique_ptr<T[]> r = new T[x*y];
    for(int a = 0; a < x; ++a)
        for(int b = 0; b < y; ++b)
            r[x*a+b] = p[y*b+a];
    return r;
}

答案 4 :(得分:0)

如果你想避免双for循环,你应该能够用数学方法做到这一点

for (int i = 0; i < 36; ++i) {
    copyarray[6 * (i % 6) + i / 6] = array[i]
}

基本上,6 * (i % 6)将您与转置矩阵中的右行对齐,i / 6(ab)使用整数除法将列值转换为行值。如果你可以忍受杂乱,那么floor (i / 6.0)会更正确。