public SetElement ( int nRow, int nCol, double value ) : bool | ||
nRow | int | |
nCol | int | |
value | double | |
return | bool |
/** * �����ת�� * * @return Matrix�ͣ�ָ������ת�þ��� */ public Matrix Transpose() { // ����Ŀ����� Matrix Trans = new Matrix(numColumns, numRows); // ת�ø�Ԫ�� for (int i = 0 ; i < numRows ; ++i) { for (int j = 0 ; j < numColumns ; ++j) Trans.SetElement(j, i, GetElement(i, j)) ; } return Trans; }
/** * ʵ�־���ļ��� * * @param other - ��ָ����������ľ��� * @return Matrix�ͣ�ָ��������other���֮�� * @����������/������ƥ�䣬����׳��쳣 */ public Matrix Subtract(Matrix other) { if (numColumns != other.GetNumColumns() || numRows != other.GetNumRows()) throw new Exception("�������/������ƥ�䡣"); // ���������� Matrix result = new Matrix(this) ; // �������� // ���м������� for (int i = 0 ; i < numRows ; ++i) { for (int j = 0 ; j < numColumns; ++j) result.SetElement(i, j, result.GetElement(i, j) - other.GetElement(i, j)) ; } return result ; }
/** * ������ij˷� * * @param AR - ��߸������ʵ������ * @param AI - ��߸�������鲿���� * @param BR - �ұ߸������ʵ������ * @param BI - �ұ߸�������鲿���� * @param CR - �˻��������ʵ������ * @param CI - �˻���������鲿���� * @return bool�ͣ�������˷��Ƿ�ɹ� */ public bool Multiply(Matrix AR, Matrix AI, Matrix BR, Matrix BI, Matrix CR, Matrix CI) { // ���ȼ���������Ƿ����Ҫ�� if (AR.GetNumColumns() != AI.GetNumColumns() || AR.GetNumRows() != AI.GetNumRows() || BR.GetNumColumns() != BI.GetNumColumns() || BR.GetNumRows() != BI.GetNumRows() || AR.GetNumColumns() != BR.GetNumRows()) return false; // ����˻�����ʵ��������鲿���� Matrix mtxCR = new Matrix(AR.GetNumRows(), BR.GetNumColumns()); Matrix mtxCI = new Matrix(AR.GetNumRows(), BR.GetNumColumns()); // ��������� for (int i=0; i<AR.GetNumRows(); ++i) { for (int j=0; j<BR.GetNumColumns(); ++j) { double vr = 0; double vi = 0; for (int k =0; k<AR.GetNumColumns(); ++k) { double p = AR.GetElement(i, k) * BR.GetElement(k, j); double q = AI.GetElement(i, k) * BI.GetElement(k, j); double s = (AR.GetElement(i, k) + AI.GetElement(i, k)) * (BR.GetElement(k, j) + BI.GetElement(k, j)); vr += p - q; vi += s - p - q; } mtxCR.SetElement(i, j, vr); mtxCI.SetElement(i, j, vi); } } CR = mtxCR; CI = mtxCI; return true; }
/** * ʵ�־���ij˷� * * @param other - ��ָ��������˵ľ��� * @return Matrix�ͣ�ָ��������other���֮�� * @����������/������ƥ�䣬����׳��쳣 */ public Matrix Multiply(Matrix other) { // ���ȼ���������Ƿ����Ҫ�� if (numColumns != other.GetNumRows()) throw new Exception("�������/������ƥ�䡣"); // ruct the object we are going to return Matrix result = new Matrix(numRows, other.GetNumColumns()); // ����˷����� // // [A][B][C] [G][H] [A*G + B*I + C*K][A*H + B*J + C*L] // [D][E][F] * [I][J] = [D*G + E*I + F*K][D*H + E*J + F*L] // [K][L] // double value ; for (int i = 0 ; i < result.GetNumRows() ; ++i) { for (int j = 0 ; j < other.GetNumColumns() ; ++j) { value = 0.0 ; for (int k = 0 ; k < numColumns ; ++k) { value += GetElement(i, k) * other.GetElement(k, j) ; } result.SetElement(i, j, value) ; } } return result ; }
/** * ʵ�־�������� * * @param value - ��ָ��������˵�ʵ�� * @return Matrix�ͣ�ָ��������value���֮�� */ public Matrix Multiply(double value) { // ����Ŀ����� Matrix result = new Matrix(this) ; // copy ourselves // �������� for (int i = 0 ; i < numRows ; ++i) { for (int j = 0 ; j < numColumns; ++j) result.SetElement(i, j, result.GetElement(i, j) * value) ; } return result ; }
/** * Լ���Գƾ���Ϊ�Գ����Խ���ĺ�˹�ɶ��±任�� * * @param mtxQ - ���غ�˹�ɶ��±任�ij˻�����Q * @param mtxT - ������õĶԳ����Խ��� * @param dblB - һά���飬����Ϊ����Ľ��������ضԳ����Խ�������Խ���Ԫ�� * @param dblC - һά���飬����Ϊ����Ľ�����ǰn-1��Ԫ�ط��ضԳ����Խ���� * �ζԽ���Ԫ�� * @return bool�ͣ�����Ƿ�ɹ� */ public bool MakeSymTri(Matrix mtxQ, Matrix mtxT, double[] dblB, double[] dblC) { int i,j,k,u; double h,f,g,h2; // ��ʼ������Q��T if (! mtxQ.Init(numColumns, numColumns) || ! mtxT.Init(numColumns, numColumns)) return false; if (dblB == null || dblC == null) return false; for (i=0; i<=numColumns-1; i++) { for (j=0; j<=numColumns-1; j++) { u=i*numColumns+j; mtxQ.elements[u]=elements[u]; } } for (i=numColumns-1; i>=1; i--) { h=0.0; if (i>1) { for (k=0; k<=i-1; k++) { u=i*numColumns+k; h=h+mtxQ.elements[u]*mtxQ.elements[u]; } } if (h == 0.0) { dblC[i]=0.0; if (i==1) dblC[i]=mtxQ.elements[i*numColumns+i-1]; dblB[i]=0.0; } else { dblC[i]=Math.Sqrt(h); u=i*numColumns+i-1; if (mtxQ.elements[u]>0.0) dblC[i]=-dblC[i]; h=h-mtxQ.elements[u]*dblC[i]; mtxQ.elements[u]=mtxQ.elements[u]-dblC[i]; f=0.0; for (j=0; j<=i-1; j++) { mtxQ.elements[j*numColumns+i]=mtxQ.elements[i*numColumns+j]/h; g=0.0; for (k=0; k<=j; k++) g=g+mtxQ.elements[j*numColumns+k]*mtxQ.elements[i*numColumns+k]; if (j+1<=i-1) for (k=j+1; k<=i-1; k++) g=g+mtxQ.elements[k*numColumns+j]*mtxQ.elements[i*numColumns+k]; dblC[j]=g/h; f=f+g*mtxQ.elements[j*numColumns+i]; } h2=f/(h+h); for (j=0; j<=i-1; j++) { f=mtxQ.elements[i*numColumns+j]; g=dblC[j]-h2*f; dblC[j]=g; for (k=0; k<=j; k++) { u=j*numColumns+k; mtxQ.elements[u]=mtxQ.elements[u]-f*dblC[k]-g*mtxQ.elements[i*numColumns+k]; } } dblB[i]=h; } } for (i=0; i<=numColumns-2; i++) dblC[i]=dblC[i+1]; dblC[numColumns-1]=0.0; dblB[0]=0.0; for (i=0; i<=numColumns-1; i++) { if ((dblB[i]!=(double)0.0) && (i-1>=0)) { for (j=0; j<=i-1; j++) { g=0.0; for (k=0; k<=i-1; k++) g=g+mtxQ.elements[i*numColumns+k]*mtxQ.elements[k*numColumns+j]; for (k=0; k<=i-1; k++) { u=k*numColumns+j; mtxQ.elements[u]=mtxQ.elements[u]-g*mtxQ.elements[k*numColumns+i]; } } } u=i*numColumns+i; dblB[i]=mtxQ.elements[u]; mtxQ.elements[u]=1.0; if (i-1>=0) { for (j=0; j<=i-1; j++) { mtxQ.elements[i*numColumns+j]=0.0; mtxQ.elements[j*numColumns+i]=0.0; } } } // ����Գ����ԽǾ��� for (i=0; i<numColumns; ++i) { for (j=0; j<numColumns; ++j) { mtxT.SetElement(i, j, 0); k = i - j; if (k == 0) mtxT.SetElement(i, j, dblB[j]); else if (k == 1) mtxT.SetElement(i, j, dblC[j]); else if (k == -1) mtxT.SetElement(i, j, dblC[i]); } } return true; }