在Scala中旋转矩阵而无需使用二维数组

时间:2019-02-04 00:48:07

标签: scala functional-programming

预先感谢您的帮助,我来自Java背景,对Scala还是陌生的。练习。我从功能的角度考虑了一些经典问题。一个这样的问题是必须在某个方向上将矩阵旋转90度的问题,下面是此问题的示例:

https://www.geeksforgeeks.org/inplace-rotate-square-matrix-by-90-degrees/

我要实现的功能具有以下签名:

def rotateMatrix[A](mat: Map[(Int,Int),A],n: Int):Map[(Int,Int),A] = {
    mat.map {case (k,v) => k match {
      case (i,j) => (???, ???) -> v
    }}
  }

我觉得应该对i和j进行一些数学变换,以将它们变换为旋转矩阵的坐标。这可能吗?

编辑:这里n是矩阵的大小,例如:对于3X3矩阵,n是3

1 个答案:

答案 0 :(得分:0)

我在这里找到了答案:

https://math.stackexchange.com/questions/1676441/how-to-rotate-the-positions-of-a-matrix-by-90-degrees

使用此功能可以实现为:

#include "MyOwnVector.h"


template<typename T> 
MyOwnVector<T>::MyOwnVector(const std::initializer_list<T>& list)
{
    this->vector_size = list.size(); 
    this->storage = std::make_unique<T[]>(new T[this->vector_size]);

    for (size_t i = 0; i < this->vector_size; i++)
    {
        this->storage[i] = *(list.begin() + i);
    }
}

编辑:基于@jwvh的输入,可以通过以下方式将其更新为scala一线式:

def rotateMatrix[A](mat: Map[(Int,Int),A],n: Int):Map[(Int,Int),A] = {
    mat map {case (k,v) => k match {
      case (i,j) => (j, n + 1 - i) -> v
    }}
}