• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2次元配列のnew)

C++で4x4行列のデータを読み込んでvector配列に保存する方法について

このQ&Aのポイント
  • C++で4x4行列のデータを読み込んでvector配列に保存する方法についてアドバイスを求めています。
  • 現在、float[4][4]の先頭ポインタの配列であるvector配列を使用していますが、エラーが発生しています。
  • 多次元配列のnew方法についてより良い解決策を求めています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 配列型は代入可能ではないんですか。 たとえば、 float m1[4][4], m2[4][4]; とあった場合、 m1 = m2; とはできませんよね。 ちなみに、newで生成する場合は次のようにします。 float (*m)[4] = new float[4][4];

kuoom
質問者

お礼

詳しい説明ありがとうございます。 勉強になりました。 要素が float m[4][4]; だけの構造体をつくるとこで、一応問題は解決しました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.5

「C++ 二次元vertor」で検索してみましたら、下記の例が見つかりました。 いろいろな方法があるようですね。 http://okwave.jp/qa/q1748241.html

kuoom
質問者

お礼

回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.4

#3ですが、自分の書いたコードについて付記を。 個人的な事情により駆け足で書いたコードのため、投稿後気付いただけでも「行列の各要素にアクセスするメソッドが抜けている」「乗算に桁落ちに対する考慮が全くなされていない」「代入でないほうの乗算は少々非効率的」という問題がありますのでご注意ください。

kuoom
質問者

お礼

回答ありがとうございます。 長いコードを書いて下さりありがとうございます。 自分は、 struct MATRIX4x4{ float m[4][4]; }; vector<MATRIX4x4*> matrix; MATRIX4x4 *m = new MATRIX4x4; for(int g=0; g<4; g++) for(int r=0; r<4; r++) m->m[g][r]=GetFloatToken(); key->matrix.push_back(m); とすることで解決しました。 あとで計算するときには、 matrix[0]->m[][] みたいにしてやるだけなので、float[4][4]の形で使えます。 せっかく書いてくださったのですが、今回は書きなおしが楽なのでこちらを使うことにします。 >「行列の各要素にアクセスするメソッドが抜けている」 privateからpublicにimplを移して解決、でいいような気がします。 現在行列の計算はすべて関数で実装しているので、operatorは全然つかってないんです。 それなので、かなり書きなおさないと使えないんです。 operatorをつかったらもっと見やすいコードになると思いますが、今はやる気がびみょーなので またやる気があったら書き直すか検討してみたいと思います。

すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

> あとで行列の計算をするのが楽なので、float[4][4]の形は変えたくないです というのなら、そういうクラスを作ってしまいましょう。 (ぐぐったら主にUNIX/Linux用のよさそうなライブラリがあったのは置いといて。GPLだから利用して問題がないか考慮する必要もあります) class Matrix4 { private:  float impl[4][4]; public:  Matrix4();  Matrix4(const Matrix4& src);  Matrix4(float src[4][4]);  Matrix4& operator=(const Matrix4& src);  Matrix4& operator+=(const Matrix4& src);  Matrix4& operator-=(const Matrix4& src);  Matrix4& operator*=(const Matrix4& src); }; Matrix4& operator+(const Matrix4& lhs, const Matrix4& rhs); Matrix4& operator-(const Matrix4& lhs, const Matrix4& rhs); Matrix4& operator*(const Matrix4& lhs, const Matrix4& rhs); Matrix4::Matrix4() {  for(int i = 0; i < 4; i++){   for(int j = 0; j < 4; j++){    impl[i][j] = 0.0F;   }  } } Matrix4::Matrix4(const Matrix4& src) {  memcpy(impl, src.impl, sizeof(impl)); } Matrix4::Matrix4(float src[4][4]) {  memcpy(impl, src, sizeof(impl)); } Matrix4& Matrix4::operator=(const Matrix4& src) {  if (impl != src.impl)   memcpy(impl, src.impl, sizeof(impl));  return *this; } Matrix4& Matrix4::operator+=(const Matrix4& src) {  for(int i = 0; i < 4; i++){   for(int j = 0; j < 4; j++){    impl[i][j] += src.impl[i][j];   }  }  return *this; } Matrix4& Matrix4::operator-=(const Matrix4& src) {  for(int i = 0; i < 4; i++){   for(int j = 0; j < 4; j++){    impl[i][j] -= src.impl[i][j];   }  }  return *this; } Matrix4& Matrix4::operator*=(const Matrix4& src) {  float result[4][4];  for(int i = 0; i < 4; i++){   for(int j = 0; j < 4; j++){    result[i][j] = 0.0F;    for(int k = 0; k < 4; k++){     result[i][j] += impl[i][k] * src.impl[k][j];    }   }  }  memcpy(impl, result, sizeof(impl));  return *this; } Matrix4 operator+(const Matrix4& lhs, const Matrix4& rhs) {  Matrix4 result(lhs);  result += rhs;  return result; } Matrix4& operator-(const Matrix4& lhs, const Matrix4& rhs) {  Matrix4 result(lhs);  result -= rhs;  return result; } Matrix4& operator*(const Matrix4& lhs, const Matrix4& rhs) {  Matrix4 result(lhs);  result *= rhs;  return result; } こんな感じだと思います。 まあ、だれかもっと効率的な実装を書くでしょうが。

参考URL:
http://www.gnu.org/software/octave/
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

vectorの要素は代入可能でなければなりません。 配列型は代入可能ではありませんので、まともにコンパイルできないか、あるいはまともに動きません。

kuoom
質問者

お礼

回答ありがとうございます。 配列型は代入可能ではないんですか。知らなかったです。 関数の引数としては受け取れたので出来るかと思っていました; 代入可能ではないということは、newから受け取るのも難しいってことですよね。 それじゃあ今回は諦めて、別の方法を考えたいと思います。

すると、全ての回答が全文表示されます。

関連するQ&A