java实现施密特正交化求标准正交基

/**
 * @author  Xbss
 * @create 2022-09-19-21:02
 * @version  1.0
 * @describe
 */
fun main() {
    val reader = Scanner(System.`in`)
    println("请输入向量维度")
    val len = reader.nextLine().toInt()
    println("请输入向量个数")
    val size = reader.nextLine().toInt()
    val array = Array(size){Array<Fraction>(len){ Fraction(0,0) }}
    var row = 0
    for (i in 0 until size){
        val nextLine = reader.nextLine()
        val value = nextLine.split(" ")
        if (nextLine.isNotEmpty()){
            for ((s,v) in value.withIndex()){
                array[row][s]= Fraction(v.toInt(),1)
            }
            row++
        }
    }
    val tArray = transpose(array)
    println("开始计算")
    val arrays = compute(len, tArray)
    for (i in arrays.indices){
        for (j in arrays[i]){
            print("$j  ")
        }
        println()
    }
}
fun compute(size:Int, array:Array<Array<Fraction>>):Array<Array<Fraction>>{
    val rArray = array
    for (i in 0 until size){
        rArray[i] = computeItem(rArray,i)
    }
    return rArray
}
fun computeItem(array:Array<Array<Fraction>>,size: Int):Array<Fraction>{
    if (size == 0){
        return array[0]
    }
    val len = array[0].size
    var sum = Array<Fraction>(len){ Fraction(0,0) }
    for (i in 0 until size){
        sum += multiplyNum(Fraction(multiply(array[i],array[size]),multiply(array[i], array[i])),array[i],len)
    }
    return array[size]-sum
}
//operator fun DoubleArray.plus(a:DoubleArray):DoubleArray{
operator fun Array<Fraction>.plus(a:Array<Fraction>):Array<Fraction>{
    val rArray = Array<Fraction>(a.size){ Fraction(0,0) }
    for ((index,value ) in a.withIndex()){
        rArray[index] = this[index]+value
    }
    return rArray
}
//operator fun DoubleArray.minus(a:DoubleArray):DoubleArray{
operator fun Array<Fraction>.minus(a:Array<Fraction>):Array<Fraction>{
    val rArray = Array<Fraction>(a.size){ Fraction(0,0) }
    for ((index,value ) in a.withIndex()){
        rArray[index] = this[index]-value
    }
    return rArray
}
fun multiply(a:Array<Fraction>,b:Array<Fraction>):Fraction{
    var result = Fraction(0,0)
    for (i in a.indices){
        result += a[i]*b[i]
    }
    return result
}
fun multiplyNum(b:Fraction,a:Array<Fraction>,size: Int):Array<Fraction>{
    val rArray = Array<Fraction>(size){Fraction(0,0)}
    for ((index,value) in a.withIndex()){
        rArray[index] = value*b
    }
    return rArray
}
//fun transpose(array: Array<DoubleArray>):Array<DoubleArray>{
/**
 * TODO :将给定的矩阵转置
 *
 * @param array
 * @return
 */
fun transpose(array: Array<Array<Fraction>>):Array<Array<Fraction>>{
//    val tArray = Array(array.size){Array<Fraction>(array.size){Fraction(1,1)}}
    val tArray = Array(array[0].size){Array<Fraction>(array.size){Fraction(1,1)}}
    for (i in array.indices){
        for (j in 0 until array[0].size){
            tArray[j][i] = array[i][j]
        }
    }
    return tArray
}

自己写的分数类:

class Fraction() {
    private var molecular=0
    private var denominator=0
    constructor(a:Int,b:Int):this(){
        if (a!=0){
            molecular = a
            denominator =b
            simple()
        }
    }
    constructor(a:Fraction,b:Fraction):this(){
        if (a.molecular==0||b.molecular==0){
            molecular=0
            denominator=0
        }else{
            molecular = a.molecular*b.denominator
            denominator = a.denominator*b.molecular
        }
        if (molecular!=0)
            simple()
    }
    operator fun plus(a:Fraction):Fraction{
        return if (molecular==0)
            a
        else if(a.molecular==0)
            this
        else{
            Fraction(this.molecular*a.denominator+a.molecular*this.denominator,this.denominator*a.denominator)
        }
    }
    operator fun minus(a:Fraction):Fraction{
        return if (molecular==0)
            Fraction(a.molecular*-1,a.denominator)
        else if (a.molecular==0)
            this
        else
            Fraction(this.molecular*a.denominator-a.molecular*this.denominator,this.denominator*a.denominator)
    }
    operator fun times(a:Fraction):Fraction{
        return Fraction(this.molecular*a.molecular,this.denominator*a.denominator)
    }
    private fun simple(){
        var flag = false
        if (molecular*denominator<0){
            molecular = abs(molecular)
            denominator = abs(denominator)
            flag=true
        }else if (molecular<0&&denominator<0){
            molecular = abs(molecular)
            denominator = abs(denominator)
        }
        val dividend = molecular.coerceAtMost(denominator)
        for (i in dividend downTo  2){
            if (molecular%i==0&&denominator%i==0){
                molecular /= i
                denominator /= i
            }
        }
        if (flag)
            molecular *= -1
    }
    override fun toString(): String {
        return if (denominator==1)
            molecular.toString()
        else if (molecular==0)
            "0"
        else
            "$molecular/$denominator"
    }
}

运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值