From 91d837940903c2fb03eef8db609e0a531970f56f Mon Sep 17 00:00:00 2001 From: Ilya Pekelny Date: Sat, 14 Apr 2018 18:24:15 +0300 Subject: [PATCH] Transpose matrix with allocation of a new one --- matrix.go | 19 +++++++++++++++++++ matrix_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/matrix.go b/matrix.go index 2d1ef17..1a34718 100644 --- a/matrix.go +++ b/matrix.go @@ -77,3 +77,22 @@ func OuterProduct(column, row []float64) (output [][]float64) { } return } + +func Transpose(matrix [][]float64, lineSize int) (output [][]float64, err error) { + output = make([][]float64, lineSize) + for i, v := range matrix { + if len(v) != lineSize { + err = fmt.Errorf( + "Inconsistent matrix line size. Expected: %d. Actual: %d", + lineSize, len(v), + ) + return + } + for j := range v { + // To do transpose in place switch matrix items + //matrix[i][j], matrix[j][i] = matrix[j][j], matrix[i][j] + output[j] = append(output[j], matrix[i][j]) + } + } + return +} diff --git a/matrix_test.go b/matrix_test.go index 75d72e0..d1fd5de 100644 --- a/matrix_test.go +++ b/matrix_test.go @@ -189,3 +189,46 @@ func TestEntrywiseSum(t *testing.T) { }) } } + +func TestTranspose(t *testing.T) { + type args struct { + matrix [][]float64 + lineSize int + } + tests := []struct { + name string + args args + wantOutput [][]float64 + wantErr bool + }{ + { + name: "transpose", + args: args{ + [][]float64{ + {1, 2, 3, 4}, + {1, 2, 3, 4}, + {1, 2, 3, 4}, + }, + 4, + }, + wantOutput: [][]float64{ + {1, 1, 1}, + {2, 2, 2}, + {3, 3, 3}, + {4, 4, 4}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotOutput, err := Transpose(tt.args.matrix, tt.args.lineSize) + if (err != nil) != tt.wantErr { + t.Errorf("Transpose() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(gotOutput, tt.wantOutput) { + t.Errorf("Transpose() = %v, want %v", gotOutput, tt.wantOutput) + } + }) + } +}