2次型转化为标准型代码
来源:互联网 发布:mac sublime 菜单栏 编辑:程序博客网 时间:2024/06/06 08:55
线性代数中已经证明:对于任意一个对实称矩阵A,必然存在可逆矩阵C,满足 C1 * A * C 是对角矩阵,其中C1为C的转置。一下为实现代码。
package myMatrix;
import java.io.*;
import java.util.*;
public class matrix {
public doublearr[][];
public intr,c;
matrix(int r,intc){
this.r =r;
this.c =c;
arr = new double [r][c];
for(inti = 0;i < r;i++){
for(intj = 0;j < c;j++){
arr[i][j] = 0;
}
}
}
matrix(matrix s){
r = s.r;
c = s.c;
arr = new double [r][c];
for(inti = 0;i < r;i++){
for(intj = 0;j < c;j++){
arr[i][j] =s.arr[i][j];
}
}
}
void change(inti,int j,doublev){
if(i >= 0 &&i< r && j >= 0 &&j < c){
arr[i][j] =v;
}
}
void swap(inti,int j, boolean row){
if(i !=j){
if(row ==true){
if(i >= 0 &&i< r && j >= 0 &&j < r){
for(ints = 0; s < c;s++){
doubletep = arr[i][s];
arr[i][s] =arr[j][s];
arr[j][s] =tep;
}
}
} elseif(row == false) {
if(i >= 0 &&i< c && j >= 0 &&j < c){
for(ints = 0; s < r;s++){
doubletep = arr[s][i];
arr[s][i] =arr[s][j];
arr[s][j] =tep;
}
}
}
}
}
void moveTo(inti,int j, double mul, boolean row){
if(row ==true){
if(i >= 0 &&i< r && j >= 0 &&j < r){
for(ints = 0; s < c;s++){
arr[j][s] +=arr[i][s] *mul;
}
}
} elseif(row == false) {
if(i >= 0 &&i< c && j >= 0 &&j < c){
for(ints = 0; s < r;s++){
arr[s][j] +=arr[s][i] *mul;
}
}
}
}
public String toString(){
String res = String.valueOf(r) +" " + String.valueOf(c) + "\n";
for(inti = 0; i < r;i++){
for(intj = 0; j < c;j++){
res += String.valueOf(arr[i][j]) +" ";
}
res +="\n";
}
returnres;
}
public static matrix getE(intn){
matrix e = new matrix(n,n);
for(inti = 0; i < n;i++){
e.arr[i][i] = 1;
}
returne;
}
public static matrix generateRondom(intr,int c,intrange){
Random ra = new Random();
matrix t = new matrix(r,c);
for(inti = 0;i < r;i++){
for(intj = 0;j < c;j++){
t.arr[i][j] =ra.nextInt(range);
if(ra.nextBoolean()){
t.arr[i][j] *= -1;
}
}
}
returnt;
}
public staticboolean compare(matrix a,matrix b){
if(a.r !=b.r || a.c !=b.c) {
returnfalse;
}
for(inti = 0; i < a.r;i++){
for(intj =0; j < a.c;j++){
if(Math.abs(a.arr[i][j] -b.arr[i][j]) >= 1e-10){
returnfalse;
}
}
}
returntrue;
}
public static matrix multiply(matrixa,matrix b){
if(a.c !=b.r){
returnnull;
}
matrix res = new matrix(a.r,b.c);
for(inti = 0; i < a.r;i++){
for(intj = 0; j < b.c;j++){
doublesum = 0;
for(ints = 0; s < a.c;s++){
sum +=a.arr[i][s] *b.arr[s][j];
}
res.change(i,j, sum);
}
}
return res;
}
public static matrix getReverse(matrixa){
matrix res = new matrix(a.c, a.r);
for(inti = 0; i < a.r;i++){
for(intj = 0; j < a.c;j++){
res.change(j,i, a.arr[i][j]);
}
}
returnres;
}
public static matrix getCForsymmetricalMatrix(matrixtep){
if(tep.r !=tep.c){
returnnull;
}
for(inti = 0; i < tep.r;i++){
for(intj = i + 1; j <tep.r; j++) {
if(tep.arr[i][j] !=tep.arr[j][i]){
returnnull;
}
}
}
matrix copy = new matrix(tep);
matrix t = new matrix(tep);
matrix res = getE(t.r);
for(inti = 0; i < t.r;i++){
if(Math.abs(t.arr[i][i]) < 1e-10) {
t.arr[i][i] = 0;
intj = i + 1;
for(;j <t.r; j++) {
if(Math.abs(t.arr[i][j]) >= 1e-10){
break;
}
}
if(j ==t.r) {
continue;
}
if(Math.abs(t.arr[j][j]) < 1e-10) {
t.moveTo(i,j, 1, true);
t.moveTo(i,j, 1, false);
res.moveTo(i,j, 1, false);
}
t.swap(i,j, true);
t.swap(i,j, false);
res.swap(i,j, false);
}
for(intj = i + 1; j <t.r; j++){
if(Math.abs(t.arr[i][j]) >= 1e-10) {
doubletep1 = t.arr[i][j];
t.moveTo(i,j, -tep1/t.arr[i][i],true);
t.moveTo(i,j, -tep1/t.arr[i][i],false);
res.moveTo(i,j, -tep1/t.arr[i][i],false);
}
}
}
//System.out.println("ter---" + t);
//System.out.println(multiply(multiply(getReverse(res),copy),res));
if(compare(t, multiply(multiply(getReverse(res),copy),res)) ==false) {
returnnull;
}
returnres;
}
public staticvoid main(String[] args) throws IOException {
int count = 1000000;
intCase = count;
int succ = 0;
while(Case != 0) {
Case--;
int n = 8;
matrix t = generateRondom(n,n,2);
for(inti = 0; i < n;i++) {
for(intj = i + 1; j <n; j++){
t.arr[j][i] =t.arr[i][j];
}
}
matrix c = getCForsymmetricalMatrix(t);
if(c !=null){
succ++;
} else {
System.out.println("error");
}
}
System.out.println(succ ==count);
System.out.println(succ);
System.out.println(count);
}
}
- 2次型转化为标准型代码
- python2代码转化为python3
- C 代码转化为C++代码
- 将c++代码转化为lua代码
- 低位转化为高位的代码
- 将word文档转化为html(代码)
- C++森林转化为二叉树代码
- Java之泛型进阶——泛型代码转化为普通代码
- js数租,对象, 数组,字符串,函数,变量,int与String 型转化,String 转化为js 中内部代码,编码格式转化,<a>标签的死链接
- 将C++代码转化为高亮的html代码
- 线性代数(九) : 矩阵的行简化阶梯型和标准型
- 泛型转化为datatable
- 字符串转化为整型2
- 整型转化为字符串2
- 十进制转化为2进制
- 134.78转化为2进制
- 十进制转化为十六进制2
- Python 2转化为Python3
- 蓝桥杯 BASIC-30 基础练习 阶乘计算
- VC 如何读取字节的每一位
- SpringMVC执行图解和源码分析
- 1096. Consecutive Factors (20)
- poj 2296 Map Labeler (2-sat +二分)
- 2次型转化为标准型代码
- 第一次使用Android Studio时你应该知道的一切配置
- oracle 查询对应表空间里面存储的表,以及更换表的表空间
- 她胖吗?
- 基于Blod的ajax进度条下载实现
- Nginx允许显示网站目录文件列表
- android 中的线性布局与相对布局
- Linux下安装 jdk tomcat apache mysql
- 如何写好简历