/**
* Matrix.java
*/
package structure;
import java.io.Serializable;
/**
* <p>鍩虹鏁版嵁绫伙紝琛ㄧず鐭╅樀銆傚悜閲忋?鐭╅樀閮界敱姝ょ被琛ㄧず銆?/p>
* @author Nano.Michael
* @version 1.0.0
* @date 2013-8-20
* @author (latest modification by Nano.Michael)
* @since 1.0.0
*/
public class Matrix implements Serializable{
private static final long serialVersionUID = 1L;
/**
* 鐭╅樀鐨勫垪鏁? */
protected int cols = 0;
/**
* 鐭╅樀鐨勮鏁? */
protected int rows = 0;
/**
* 淇濆瓨鐭╅樀鐨勬暟鎹? */
protected double[] d = null;
/**
* 鏁版嵁鍒楁暟锛屾渶鍘熷鐭╅樀鐨勫垪鏁? */
protected int dCols = 0;
/**
* 鐩稿浜庢渶鍘熷鐭╅樀锛堢敱鏋勯?鏂规硶寰楀埌锛夌殑琛岃寖鍥达紝鏈?垵杩欎釜瀛楁搴旇绛変簬Range.all()锛屽綋rowRange琚0鏄庯紝鍒欒繖涓煩闃电殑琛屽紑濮? * 涓嬫爣鐩稿浜庢渶鍒濈殑鐭╅樀鐨勮涓簉owRange.begin()锛岀煩闃电殑琛岀粨鏉熶笅鏍囩浉瀵逛簬鏈?垵鐨勭煩闃佃涓簉owRange.end()銆備妇涓垪瀛愶細
* 褰?code>rowRange.start==2</code>涓?code>rowRange.end==5</code>鏃讹紝閭d箞杩欎釜鐭╅樀鐩稿浜庢渶鍘熷鐭╅樀鐨勮鐨勫紑濮? * 鍜岀粨鏉熶笅鏍囦负2鍜?銆傝繖涓瓧娈典竴鑸敱锛? * @see #at(Range, Range)
* @see #set(Range, Range, Matrix)
* 浣跨敤
*/
protected Range rowRange = null;
/**
* 鐩稿浜庢渶鍘熷鐭╅樀鐨勫垪鑼冨洿锛岃В閲婂悓
* @see #rowRange
*/
protected Range colRange = null;
private Matrix(){ }
/**
* 浣跨敤澹版槑鐨勮鏁皉ows鍜屽垪鏁癱ols鏋勯?涓?釜鐭╅樀锛屾鏃跺唴瀛樺凡缁忚鍒嗛厤
* @param rows 鐭╅樀琛屾暟銆? * @param cols 鐭╅樀鍒楁暟
*/
public Matrix(int rows, int cols){
this(rows, cols, new double[cols * rows]);
}
/**
* 浣跨敤澹版槑鐨勮鏁板拰鍒楁暟浠ュ強棰勫厛鍒嗛厤鐨勫弻绮惧害娴偣鍨嬫暟鎹瀯閫犱竴涓煩闃点?
* <br><b><i>NOTICE:</i></b> 濡傛灉鐭╅樀鐨勫ぇ灏忥紙绛変簬琛屾暟*鍒楁暟锛夊皬浜庨鍏堝瓨鍌ㄧ殑鏁版嵁鐨勯暱搴︼紝绋嬪簭鑳藉姝e父鐨勮繍琛岋紝浣嗘槸骞朵笉
* 鎺ㄨ崘杩欐牱鍋氥?
* @see #Matrix(int, int)
* @param rows 鐭╅樀琛屾暟銆? * @param cols 鐭╅樀鍒楁暟銆? * @param data 棰勫厛瀛樺偍鐨勬暟鎹?
*/
public Matrix(int rows, int cols, double[] data){
if (cols <= 0 || rows <= 0)
throw new IllegalArgumentException("Matrix, columns and rows must be positive integer.");
if (cols * rows > data.length)
throw new IllegalArgumentException("Matrix, the size of the matrix does not match the length of the data.");
this.cols = cols;
this.rows = rows;
this.d = data;
this.dCols = cols;
rowRange = new Range(0, rows);
colRange = new Range(0, cols);
}
/**
* 鍒ゆ柇涓?釜鐭╅樀鏄惁涓哄悜閲忥紙鍒楀悜閲忔垨琛屽悜閲忥級
* @return
*/
public boolean isVector(){
return (rows!= 1&&cols!=1);
}
/**
* 鍒ゆ柇鐭╅樀鏄惁涓鸿鍚戦噺
* @return
*/
public boolean isRowVector(){
return rows==1;
}
/**
* 鍒ゆ柇鐭╅樀鏄惁涓哄垪鍚戦噺
* @return
*/
public boolean isColumnVector(){
return cols==1;
}
/**
* 鍒ゆ柇涓や釜鐭╅樀鏄惁鏄悓鍨嬬煩闃碉紙鍗宠鍒楃浉绛夛級
* @param x
* @return 鍚屽瀷杩斿洖<code>true</code>锛屽弽涔嬪垯鍙? */
public boolean sameType(Matrix x){
return (rows==x.rows&&cols==x.cols);
}
/**
* 鍒ゆ柇鏄惁涓烘柟闃点?
* @return
*/
public boolean isSquare(){
return rows==cols;
}
/**
* 寰楀埌鐭╅樀澶у皬锛坰ize=rows*columns锛? * @return
*/
public int size(){
return rows*cols;
}
/**
* 璁$畻鐭╅樀鐨勭粷瀵瑰?
* @param reserve 鎸囩ず鏄惁淇濈暀鍘熷鐭╅樀锛岃嫢<code>reserve==false</code>锛屾柟娉曞皢浣跨敤缁濆鍊肩煩闃垫浛鎹㈠師濮嬬煩闃点?
* @return 鐭╅樀鐨勭粷瀵瑰?鐭╅樀
* @see #abs()
*/
public Matrix abs(boolean reserve){
Matrix x = reserve?new Matrix(rows,cols):this;
for (int i=0; i<rows; i++)
for (int j=0; j<cols; j++){
double d = at(i, j);
x.set(i, j, d>=0.?d:-d);
}
return x;
}
/**
* 璁$畻鐭╅樀鐨勭粷瀵瑰?銆? * <br><br><b><i>NOTICE:</i></b>鏂规硶灏嗘浛鎹㈠師濮嬬煩闃点?
* @return 鐭╅樀鐨勭粷瀵瑰?鐭╅樀銆? * @see #abs(boolean)
*/
public Matrix abs(){
return abs(false);
}
/**
* 灏嗙煩闃垫竻闆躲?
*/
public void clear(){
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
set(i, j, 0);
}
/**
* 灏嗙煩闃垫嫹璐濆埌鍙﹀涓?釜鐭╅樀锛屾鏃讹紝杩欎袱涓煩闃靛繀椤绘槸鍚屽瀷鐨勶紝鏁版嵁灏嗗畬鍏ㄦ嫹璐濆埌鏂扮殑鐭╅樀锛屼絾鏄柊鐨勭煩闃靛皢鍜屽綋鍓嶇殑鐭╅樀
* 鏄畬鍏ㄧ嫭绔嬬殑銆? * @param x 鐩爣鐭╅樀銆? */
public void copyTo(Matrix x){
if (x.rows != rows || x.cols != cols)
throw new IllegalArgumentException("Matrix copy, size not match.");
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
x.set(i, j, at(i, j));
}
/**
* 灏嗙煩闃佃浆鎹负1缁存暟缁勶紝姝ゆ椂鏂规硶浠ヨ浠庡乏鑷冲彸锛屼互鍒椾粠涓婅嚦涓嬮『搴忓皢鐭╅樀杞崲涓?缁存暟缁勩?
* <br><b><i>NOTICE:</i></b>寰楀埌鐨勫皢鏄煩闃典腑鏁扮粍鐨勬嫹璐濓紝濡傛灉涓嶆兂鍐嶅彟澶栧紑杈熷瓨鍌ㄧ┖闂达紝璇蜂娇鐢▄@link #data()}鏂规硶锛? * 浣嗘槸姝ゆ柟娉曡繑鍥炵煩闃靛叏閮ㄥ厓绱狅紝涓嶈兘寰楀埌瀛愮煩闃碉紙鐢辨柟娉曪細{@link #at(Range, Range)}锛寋@link #col(int)}锛寋@link #row(int)}
* 寰楀埌锛夌殑鍏冪礌銆? * @return
*/
public double[] toArray(){
double[] x = new double[size()];
int c = 0;
for (int i=0; i<rows; i++){
for (int j=0; j<cols; j++){
x[c] = at(i, j);
c++;
}
}
return x;
}
/**
* 灏嗙煩闃佃浆鎹负2缁存暟缁勩?
* <br><b><i>NOTICE:</i></b> 寰楀埌鐨勫皢鏄煩闃典腑鏁扮粍鐨勬嫹璐濄?
* @return
*/
public double[][] to2DArray(){
double[][] x = new double[rows][cols];
for (int i=0; i<rows; i++)
for (int j=0; j<cols; j++)
x[i][j] = at(i,j);
return x;
}
/**
* 鑾峰彇瀛樺偍浜庣煩闃典腑鐨勬暟鎹?
* @return 鏁版嵁
*/
public double[] data(){
return this.d;
}
/**
* 鑾峰彇鐭╅樀鐨勫垪鏁般?
* @return 鐭╅樀鐨勫垪鏁般?
*/
public int columns(){
return this.cols;
}
/**
* 鑾峰彇鐭╅樀鐨勮鏁般?
* @return 鐭╅樀琛屾暟銆? */
public int rows(){
return this.rows;
}
/**
* 鑾峰彇鐭╅樀鍦ㄨ涓嬫爣涓篿澶勭殑琛屽悜閲忋?
* @param i 琛屼笅鏍囥?
* @return 鐗瑰畾鐨勮鍚戦噺銆? */
public Matrix row(int i){
return at(new Range(i, i+1), Range.all());
}
/**
* 鑾峰彇鐭╅樀鍦ㄥ垪涓嬫爣涓篿澶勭殑鍒楀悜閲忋?
* @param i 鍒椾笅鏍囥?
* @return 鐗瑰畾鐨勫垪鍚戦噺銆? */
public Matrix col(int i){
return at(Range.all(), new Range(i, i+1));
}
/**
* 鏋勯?涓?釜浠庝互pitch涓洪棿闅斾粠begin鍒癳nd閫掑鐨勫悜閲忋?
* @param begin 鍚戦噺寮?鏁版嵁
* @param pitch 闂撮殧
* @param end 鍚戦噺缁撴潫
* @return
*/
public static Matrix increment(double begin, double pitch, double end){
int r = (int)((end-begin)/pitch);
if (r<=0)
throw new IllegalArgumentException("Matrix increment, end must greater than begin.");
Matrix x = new Matrix(r, 1);
double pre = begin;
for (int i=0; i<x.rows; i++){
x.set(i, pre);
pre += pitch;
}
return x;
}
/**
* 鏋勯?涓?釜鐭╅樀褰㈠ A=u*I, I 鏄崟浣嶅悜閲? u 鏄竴涓爣閲忋?
* @param size 鐭╅樀鐨勮竟闀裤? (size=rows=columns)
* @param scale 缂╂斁姣斿垪銆? * @return A
* @see #unit(int)
*/
public static Matrix unit(int size, double scale){
Matrix x = new Matrix(size, size);
for (int i = 0; i < size; i++)
x.set(i, i, scale);
return x;
}
/**
* 鏋勯?涓?釜鍗曚綅鐭╅樀銆? * @param size 鐭╅樀杈归暱銆?size=rows=columns)
* @return 鍗曚綅鐭╅樀銆? * @see #unit(int, double)
*/
public static Matrix unit(int size){
return unit(size, 1.);
}
/**
* 鏋勯?涓?釜鎵?湁鍏冪礌鍏锋湁鐩稿悓鏁版嵁鐨勭煩闃碉紝褰㈠锛欰=N*scale锛孨涓?鐭╅樀锛宻cale涓虹缉鏀炬瘮渚嬨?
* @param rows 鐭╅樀琛屾暟銆? * @param cols 鐭╅樀鍒楁暟銆? * @param scale 缂╂斁姣斾緥銆? * @return A
* @see #ones(int, int)
*/
public static Matrix ones(int rows, int cols, double scale){
Matrix x = new Matrix(rows, cols);
for (int i = 0; i < x.rows; i++)
for (int j = 0; j < x.cols; j++)
x.set(i, j, scale);
return x;
}
/**
* 鏋勯?涓?釜鎵?湁鍏冪礌涓?鐨勭煩闃点?
* @param rows 鐭╅樀琛屾暟銆? * @param cols 鐭╅樀鍒楁暟銆? * @return A
* @see #ones(
- 1
- 2
- 3
前往页