转置一维阵列
Transpose 1 Dimensional Array
所以我有一个具有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维的数组,逻辑会如何?
使用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]);
转置运算对不包括矩阵对角线的上三角形或下三角形执行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]);
你本可以自己想出来的。。。
#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] << " ";
}
}
您可以交换矩阵中的值,也可以交换后面函数中的解释。
例如,您可以打印一个(j,i(并打印转换姿势,而不是打印(i,j(。
话虽如此,你想做什么检查?如果你看看LAPACK和BLAS,它们的例程采用控制算法的标志来正常解释它们或将它们转换为转置。
不使用交换函数。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];
}
}
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是矩阵的"水平"answers"垂直"大小。#ifdeffed-out部分是天真的实现。在您的情况下,您可以使用初始化(或分析(一维阵列
for (i=0; i < 9; i++)
arr[i] = other(3, 3, i);
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- STL算法函数在多个一维容器上的使用
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 将一维数组写入 CSV C++中的不同列?
- C++:将矩阵存储在一维数组中
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 一维阵列的运动检测(神经网络或其他选项?
- 编写所需的代码以创建动态一维整数数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 使用两个不同大小的一维阵列制作 2D 阵列
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 新的一个一维阵列,非常大,例如60000*60000
- 将一维动态阵列反转为n维
- 将二维阵列模拟为一维阵列
- 高效地将多个一维阵列中的数据收集到单个一维阵列中
- 转置一维阵列