我有一个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列中的值。)
答案 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)
会更正确。