试图将矩阵(不是就地)从一个向量旋转到另一个向量

时间:2017-04-22 01:09:26

标签: c++ matrix

我一直试图编写一个程序,将矩阵顺时针或逆时针旋转90度,但我不知道怎么做,当我在网上查找它时。我看到很多就地解决方案并不是我原本打算做的。我的想法是创建另一个nxn矩阵,只是将值从一个矩阵复制到另一个矩阵。下面是代码:

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;


vector<vector<int> > rotate(const vector<vector<int> > &v);

int main(){
    vector<vector<int> > vec{{1,1,1},
                             {2,2,2},
                             {3,3,3}};

    // original

    for (int i = 0; i < vec.size(); i++) {
        for (int j = 0; j < vec[0].size(); j++) {
            cout << vec[i][j];
        }
        cout << "\n";
    }

    cout << "after rotation:\n";
    // print matrix after rotation
    vector<vector<int> > ans = rotate(vec);
    for (int i = 0; i < ans.size(); i++) {
        for (int j = 0; j < ans[0].size(); j++) {
            cout << ans[i][j];
        }
        cout << "\n";
    }

    return 0;
}

vector<vector<int> > rotate(const vector<vector<int> > &v) {
    vector<vector<int> > ans;

    int height = v.size(), width = v[0].size();
    for (int i = 0; i < height; i++) {
        vector<int> row;
        ans.push_back(row);
        for( int j = 0; j < width; j++){
            ans.at(i).push_back(0);
        }

    }

    for(int i = 0; i <= height; i++) {
        for(int j = 0; j < width; j++) {
            //here i deleted my code because it didn't copy the value over correctly!
        }
    }

    return ans;
}

我做了很多关于如何做矢量的研究(非常混淆了&amp;和东西)现在我一直在试图想出一种复制值的方法,并且进行了一些奇怪的旋转(不是90度),所以我删除了我所做的,希望你能给我一些关于该做什么的提示。

所以说顺时针旋转90度后我会有原始矩阵。

111      321
222  ==> 321
333      321

2 个答案:

答案 0 :(得分:2)

所以你从矩阵看起来像:

matrix

然后您要使用ij对其进行索引,以访问它的旋转版本:

index into matrix

因此,您可以看到in转到0j0转到ni是x轴,j是y轴。因为您使用[y][x]索引到矩阵,所以最终得到如下内容:

vector<vector<int> > rotate(const vector<vector<int> > &v) {
    int n = v.size();

    // create nxn matrix
    vector<vector<int> > ans(n, vector<int>(n));

    // copy in the values rotated
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            ans[i][j] = v[j][n - i - 1];
        }
    }

    return ans;
}

实例here

答案 1 :(得分:1)

111      321
222  ==> 321
333      321

观察当我们遍历第一个矩阵的第一行时,我们想要将111复制为次要矩阵的最后一列,并将222(第二行)复制为次要矩阵的倒数第二列等等。这样做的一种方法是:

for(int i = 0; i < width; i++) {
    for(int j = 0; j < height; j++) {
        ans[j][width-1-i] = v[i][j];
    }
}

所以你有

ans[0][2] = v[0][0]
ans[1][2] = v[0][1]
ans[2][2] = v[0][2]
ans[0][1] = v[1][0]
        .....