English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

 ***切記程式必須符合以下三點敘述才給點數喔!***1. 請使用類別來設計一類別矩陣及相關的    函式,可使下面所顯示的程式正確地執行。 2. 須使用動態記憶體,可提供任意尺寸位址的矩陣。 3. 須加入解構子(destructor),可用來歸還已使用    完畢的動態記憶體。  void main ()  {    matrix  a, b, c;  cin>>a>>b;  c=a+b;  cout<

2006-11-20 16:56:25 · 5 個解答 · 發問者 Terry Chou 7 in 電腦與網際網路 程式設計

***矩陣的設計為nxn陣列來表示***

2006-11-21 03:50:11 · update #1

5 個解答

這應該是作業吧!?
您老師還真是高明:
 簡單的一題,應用度也不低,
 快考遍了 C++ 裡、重要且常用的 OO 用法!

受教。

2006-11-21 00:30:35 補充:
在您的 class 裡要有
constructor
destructor
>>, <<, + = * 的 operator overload

但您老師沒寫它要的 * 是哪一種耶!

矩陣的 * 有三種,常用的也有 內、外積兩種。

2006-11-23 12:41:14 補充:
第三種我只看過我指導教授秀給我們看一次。
(他是研究用矩陣解決問題的。)
蠻奇怪的!
C=A○B
他說要把B順序倒過來,再位移一格,再乘。
還要我上黑板算給同學看。
傻眼!
算出來竟是方程式的系數。

不過,倒底怎麼算、算法叫啥名字,可能要去問數學高手了。

2006-11-23 13:01:51 補充:
來信問到 swap。

swap 一般是在說把2個東東的值交換過來。

在 C++ 函式庫裡的 swap() 有一卡車!!
基本上是上述的東東,但細節上是誰和啥交換,你要看 help 了!

有的和我們一般在講的 swap 做的是不同的事!!
我見過一個是把一個變數冑的 奇偶 bit 交換的!!
神奇吧!

2006-11-23 13:03:05 補充:
那個冑字哪來的啊!
抱歉喔!

2006-11-25 14:14:38 補充:
#include #include using namespace std;class Matrix{ public:    Matrix();      Matrix(int Row, int Col);      Matrix(const Matrix &Matrix);     ~Matrix();   Matrix  operator +  (const Matrix &addend)  const;   Matrix  operator -  (const Matrix &subtrahend);   Matrix  operator *  (const Matrix &multiplier);  // outer product const Matrix &operator =  (const Matrix &source); friend ostream &operator << (ostream &o, const Matrix &source); friend istream &operator >> (istream &i,  Matrix &source);   void  clear   (); static int   errNo;   // 1 Not enough memory         // 2 Empty size         // 4 Not of the same size         // 8 Assignment (=) change the size         // 16 column of A != row of B in *  private: int   r, c;   void  init(int r, int c);   void  resize(int r, int c);   double **M;};Matrix::Matrix()    { M = 0,   r = c = 0;  }   Matrix::Matrix(int r, int c){ init(r, c);   }Matrix::Matrix(const Matrix &M)  { init(M.r, M.c);  memcpy(*this->M, *M.M, sizeof(double)*r*c);}Matrix::~Matrix()    { delete [] M; }void  Matrix::init(int r, int c)  // Err type: bit 0{ double *buf; int  c0, i; this->r = r,  this->c = c; errNo &= ~1;      // Assume Successful if (M = new double* [r])  if (buf = new double  [r * c])   for (c0=i=0; i
2006-11-25 14:14:59 補充:
const Matrix&Matrix::operator=(const Matrix &s)
{errNo&=~8;//Assume successful
if (this != &s)
{if (!M)init(s.r, s.c);
else if (r != s.r||c != s.c)
{errNo|= 8;
resize(r = s.r, c = s.c);
}
memcpy(*M, *s.M, sizeof(double)*r*c);
}
return*this;
}

2006-11-25 14:17:15 補充:
Matrix Matrix::operator*(const Matrix &B)
{inti, j, k;

Matrixtmp(r, B.c);
if (errNo & 1)return tmp;
tmp.clear();

if (c != B.r)
{errNo|= 16;return tmp;}
errNo&=~16;//Successful

2006-11-25 14:17:29 補充:
for (i=0; i for (j=0; j for (k=0; k tmp.M[i][j]+= M[i][k] * B.M[k][j];

returntmp;
}

2006-11-25 14:18:05 補充:
inlinevoidMatrix::clear()
{memset(*M, 0, sizeof(double)*r*c);}


void Matrix::resize(int r, int c)
{if(M)delete [] M;//allocated? delete it!!
init(r, c);
}

2006-11-25 14:19:20 補充:
ostream &operator << (ostream &o, const Matrix &s)
{inti, j;

for (i=0; i {cout<<"| ";
for (j=0; j printf("%9.4f", s.M[i][j]);//format of C is better than C++
cout<<" |\n";
}

return o;
}

2006-11-25 14:20:38 補充:
istream &operator >> (istream &o, Matrix &s)
{inti, j;

cout<<"row col: ";
cin>>i>>j;
if(i != s.r||j != s.c)//Different size?
s.resize(s.r=i, s.c=j);//allocate a new one

2006-11-25 14:20:52 補充:
for (i=0; i for (j=0; j {cout<<"Please enter value of "< cin>>s.M[i][j];
}

return o;
}



intMatrix::errNo= 0;

2006-11-25 14:22:16 補充:
int main(int argc, char *argv[])
{inte= 0;
MatrixA, B, C, D, E;

cout<<"Please enter matrix A\n";cin>>A;
cout<<"Please enter matrix B\n";cin>>B;

2006-11-25 14:23:04 補充:
C= A + B;
if (A.errNo & 4)
{e|= 1,A.errNo&= ~4;
cout<<"A & B are of different size, can not add.\n";}
D= A - B;
if (A.errNo & 4)
{e|= 2,A.errNo&= ~4;
cout<<"A & B are of different size, can not add.\n";}

2006-11-25 14:23:36 補充:
E= A * B;
if (A.errNo & 16)
{e|= 4,A.errNo&= ~16;
cout<<"The columns of A is different from the rows of B.\n";}

if (!(e & 1))cout<<"C = A + B =\n"< elsecout<<"A + B is not calculable!\n";

2006-11-25 14:24:23 補充:
if (!(e & 2))cout<<"D = A - B =\n"< elsecout<<"A - B is not calculable!\n";
if (!(e & 4))cout<<"E = A * B =\n"< elsecout<<"A * B is not calculable!\n";

2006-11-25 14:24:45 補充:
system("pause");

return 0;
}

2006-11-26 02:15:59 補充:
程式確定可以跑,只是 copy 過來時,有些用 tab 的空格被 Yahoo 變成沒空格了!

像 2006-11-25 14:18:05 發表 的 第一列
inlinevoidMatrix::...
應該是
inline void Matrix::...

2006-11-25 14:17:29 發表 的
returntmp;
應刻是
return tmp;

剩下的您自己找囉!

您老師會出這樣題目來,您應該不是沒功力才對。

加油!^_^

2006-11-27 00:05:11 補充:
這些程式,我應該是把我多寫的都刪完了,除了 Matrix(int, int) 和 Matrix(Matrix) 以外。
我不記得程式其它部份有沒有用到它們了。
您若宣告Matrix 時給了大小,如
 Matrix A(3,2)
也可以;
我記得程式可以接受:
 Matrix A(3,2), B(3,2), C(5,8);
 C = A + B;
因為在 = 的部份,若大小不同,會修改 C 的大小使得它符合,但 errNo 會設成 8 (程式可以照跑,可以不理 errNo==8)。

2006-11-27 00:10:37 補充:
我在 DOS 時是使用 Turbo C的,
3年前改用 Linux 的 gcc 和 g++。
這 2 個月才改用 VC。
(一月起,VC, gcc/g++ 得都用。)

DOS 的 Turbo C 和 gcc/g++ 我會用 Makefile ,
為了程式可重用(reusable),我會把程式分成好幾個 file;
VC 目前的我,這個功力還很差。
所以,這整個程式是放在同一個 file 裡。

我手邊沒有 Turbo C++;
不過我沒用啥特殊的東東,
Turbo C++ 應該可以 Compile 才對。

2006-11-27 12:28:12 補充:
謝謝心冷大師提醒。
其實, 我雖算得上 C 的高手,
C++ 卻是菜鳥!
這個程式還是我第一次寫真正的 C++ 呢!
之前寫的除了 // 外,可說是 99.9% 以上的 C,只是用了 C++ 的 compiler。
而且,這樣 0.1% 以下的 C++ 的程式也只寫了約 10 個以下,都是交作業用的而已。

這個問題我在寫的時候有注意到,查了 MSDN ,誤以為 有[] 是刪 2 維的,沒[] 是刪 1 維的!
還在想:C++ 果然遠比 C 方便很多。

2006-11-27 12:28:25 補充:
改成這樣好像就沒問題了。
Matrix::~Matrix()
{ delete [] *M;
delete [] M;
}

這是我碩士論文 (用C寫的) 的作法的 C++ delete 版。
我確定在 C 這是對的,除了我很了解 C 以外,那程式跑了數千萬個從 180*180 到 2400 * 2400 的矩陣,沒出過錯。

再次謝謝心冷。

2006-11-27 12:38:01 補充:
不只!
它跑過 3240 * 3240。

總之,要是 destructor 或其它地方還有錯,請再告知。

2006-11-27 12:42:06 補充:
To Terry Chou & ♨超級霜淇淋♨
看了心冷意見之後發表的那篇(2006-11-27 12:28:12 發表),有沒有嚇到!?(指我對 C++ 不熟的程度!)

這是我寫的第一個有用 class 的程式!

我可以,你也可以!!
只要你願意!!

加油!^_^

2006-11-28 07:11:42 補充:
矩陣乘法有:
1. 大家熟知的那種(我寫的就是,但我這裡寫的是未加速的 O(n^3) 的方法),論文用的是 O(n^2.807)的方法)
2. 像向量內積的那種(Hadamard product)
3. 好像叫 convolution 的那種 (Kronecker product)

2006-11-29 04:43:54 補充:
敝人最完整的程式已 post 在 250free 網頁空間裡,並應已寄信告知 link 所在。
請回覆是否收到,謝謝。

2006-11-30 23:29:04 補充:
請參考
http://jacob_grace.250free.com/Matrix.zip

2006-11-25 09:14:38 · answer #1 · answered by ? 7 · 0 0

To Jacob Lee
destruct 有問題. 因為妳的init 中. new 了兩次
分別是M = new double* [r]
跟buf = new double [r * c]
可是
desturct delete [] M;

2006-11-27 12:53:28 補充:
不管C/C++ 都只能配置一塊連續的記憶體空間(用new or malloc). 二維以上. 都一樣要自己手動處理. 所以. 歸還memory 也一樣. 要有相對應的個數.
另 delete [] p
跟delete p 不同點在於
delete [] p 刪的是p= new type[n]
delete p 是刪 p = new type

2006-11-27 18:29:38 補充:
http://cockroachtw.spaces.live.com/
Matrix 範例 參考參考.

2006-11-27 06:29:30 · answer #2 · answered by SiYu 5 · 0 0

我猜你是某間北部國立科技大學的學生
題目出跟我們老師ㄧ模ㄧ樣= ="

2006-11-26 21:47:03 · answer #3 · answered by OOXX 2 · 0 0

其實問題本身並沒有很困難,麻煩是在輸入矩陣及輸出矩陣你想要怎麼表達,矩陣相乘的部分,我知道的只有一種, Jocob Lee 說有三種我就不清楚了

2006-11-23 07:24:34 · answer #4 · answered by Rody 5 · 0 0

what's the dimension of your matrix? If it is a homogeneous 4 x 4 matrix, I have something written for that already. It has most of the operations that you requested implemented already (except the overloaded streaming operator, but you should be able to do it yourself) Please let me know if you need it.

2006-11-21 01:10:54 · answer #5 · answered by ? 2 · 0 0

fedest.com, questions and answers