转置一维数组

9

我有一个包含N个值的一维数组,其中N是完全平方数。尽管它不是二维数组,但我将其视为二维数组进行可视化。例如,包含这些值的数组 int Array = { 0,1,2,3,4,5,6,7,8 }

就像这样

int *Array = new int [9];                                                                                                                                                                                                    
for ( int i = 0 ; i < 9 ; i ++ )
         Array[i] = i; // For example

这个会被打印出来

0 1 2
3 4 5 
6 7 8

我想要在一维数组中交换位置以获取其转置,...

例如...

0 3 6
1 4 7
2 5 8

这基本上是同一个一维数组,但是值被交换了,所以现在数组是int Array = {0,3,6,1,4,7,2,5,8}

如果我将其扩展到1024*1024的维数组,逻辑会如何?

6个回答

19

如果设n = sqrt(N),你可以尝试一些简单的方法,例如:

for(int i = 0; i < n; ++i)
    for(int j = i+1; j < n; ++j)
        std::swap(Array[n*i + j], Array[n*j + i]);

哈哈。这是一个非常快速的回答 ;) - Legolas
你的数组是一维数组吗? - user4768676

8

转置操作对矩阵的上三角或下三角(假设为上三角)进行swap(v[y][x], v[x][y])

在 C 语言的一维向量 vc 中,v[y][x] 对应于 vc[y*n+x]。 因此,您需要执行 vc[y*n+x] = vc[x*n+y]

要交换的元素是满足 x>y 的元素。

您最终要执行以下操作:

for(int y = 0; y < n; ++y)
    for(int x = y+1; x < n; ++x)
        swap(vc[x*n + y], vc[y*n + x]);

你本来就可以自己想到这一点...



1
#include <iostream>
#include <cmath>

using namespace std;

int xyToIndex(const int x, const int y, const int size){
    return x + y * size;
}

int main(){
    int a[] = { 0,1,2,3,4,5,6,7,8 };

    const int size = sqrt(sizeof(a)/sizeof(int));

    //print only
    for(int x = 0;x < size; ++x){
        for(int y = 0; y < size; ++y)
            cout << a[xyToIndex(x,y,size)] << " ";;
        cout << endl;
    }
    //make array
    int b[size*size];
    int index = 0;
    for(int x = 0;x < size; ++x)
        for(int y = 0; y < size; ++y)
             b[index++] = a[xyToIndex(x,y,size)];

    for(int i = 0; i< size * size ; ++i){
        cout << b[i] << " ";
    }
}

1

您可以在矩阵中交换值,或者在后续函数中交换解释。

例如,您可以打印a(j,I)和打印转置,而不是打印a(i, j)。

话虽如此,您到底想做什么?如果您查看LAPACK和BLAS,它们的例程采用标志来控制算法的正常解释或作为转置解释。


0

不使用交换函数。len是数组的长度。

int i,j;
  N = sqrt(len);    
  int temp[len];
    for(i=0;i<N;i++)
    {   for(j=0;j<N;j++)
        {
            temp[j+(i*N)] = a[(j*N)+i];
        }
    }

0
static unsigned other(unsigned dim0, unsigned dim1, unsigned index)
{

#if 0
unsigned x0,x1;
x0 = index % dim0 ;
x1 = index / dim0 ;

return x0 * dim1 + x1;

#else

unsigned mod,val;

mod = dim0 * dim1 -1;
val = (index==mod) ? mod: (dim1*index) % mod;
return val;
#endif
}

上述函数返回索引的“其他”索引(在转置矩阵中,x和y交换)。 dim0和dim1是矩阵的“水平”和“垂直”大小。#ifdeffed-out部分是朴素实现。 在您的情况下,您可以使用以下方式初始化(或分析)1维数组:

for (i=0; i < 9; i++)
    arr[i] = other(3, 3, i);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接