github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/native/dlapmt.go (about) 1 // Copyright ©2017 The gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package native 6 7 import "github.com/gonum/blas/blas64" 8 9 // Dlapmt rearranges the columns of the m×n matrix X as specified by the 10 // permutation k_0, k_1, ..., k_n-1 of the integers 0, ..., n-1. 11 // 12 // If forward is true a forward permutation is performed: 13 // 14 // X[0:m, k[j]] is moved to X[0:m, j] for j = 0, 1, ..., n-1. 15 // 16 // otherwise a backward permutation is performed: 17 // 18 // X[0:m, j] is moved to X[0:m, k[j]] for j = 0, 1, ..., n-1. 19 // 20 // k must have length n, otherwise Dlapmt will panic. k is zero-indexed. 21 func (impl Implementation) Dlapmt(forward bool, m, n int, x []float64, ldx int, k []int) { 22 checkMatrix(m, n, x, ldx) 23 if len(k) != n { 24 panic(badKperm) 25 } 26 27 if n <= 1 { 28 return 29 } 30 31 for i, v := range k { 32 v++ 33 k[i] = -v 34 } 35 36 bi := blas64.Implementation() 37 38 if forward { 39 for j, v := range k { 40 if v >= 0 { 41 continue 42 } 43 k[j] = -v 44 i := -v - 1 45 for k[i] < 0 { 46 bi.Dswap(m, x[j:], ldx, x[i:], ldx) 47 48 k[i] = -k[i] 49 j = i 50 i = k[i] - 1 51 } 52 } 53 } else { 54 for i, v := range k { 55 if v >= 0 { 56 continue 57 } 58 k[i] = -v 59 j := -v - 1 60 for j != i { 61 bi.Dswap(m, x[j:], ldx, x[i:], ldx) 62 63 k[j] = -k[j] 64 j = k[j] - 1 65 } 66 } 67 } 68 69 for i := range k { 70 k[i]-- 71 } 72 }