![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
4x4行列のデータがいくらか書いてあるファイルから、読み込んでvector配列へ保存するプログラムを考えています。
vector配列は、float[4][4]の先頭ポインタの配列です。
宣言はこんな感じで、コンパイルエラーは出ませんでした。
vector<float[4][4]> matrix;
つぎに読み込み部分で、下のような感じです。
4x4行列が見つかるたびにこれが実行されます。
GetFloatToken()は、ファイルから要素をひとつ取り出す関数です。
float m[4][4] = new float[4][4];
for(int g=0; g<4; g++)
for(int r=0; r<4; r++)
m[g][r]=GetFloatToken();
matrix.push_back(m);
newの行とpush_backしてる行でエラーが出ました。
自分が思うに、m[4][4]のとこの、newからの受け取りの仕方が悪い気がしました。
そこで、*m[4] や **m とかにして試してみましたがうまくいきませんでした。
どうすればいいんでしょうか。
もしかして、c++では多次元配列のnewは無理なんでしょうか。
わかる方がいましたら、どうか教えてください。
補足:
あとで行列の計算をするのが楽なので、float[4][4]の形は変えたくないです。
もし、多次元配列のnewが無理ということなら別の策を考えます。
No.5
- 回答日時:
No.4
- 回答日時:
#3ですが、自分の書いたコードについて付記を。
個人的な事情により駆け足で書いたコードのため、投稿後気付いただけでも「行列の各要素にアクセスするメソッドが抜けている」「乗算に桁落ちに対する考慮が全くなされていない」「代入でないほうの乗算は少々非効率的」という問題がありますのでご注意ください。
回答ありがとうございます。
長いコードを書いて下さりありがとうございます。
自分は、
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をつかったらもっと見やすいコードになると思いますが、今はやる気がびみょーなので
またやる気があったら書き直すか検討してみたいと思います。
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/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- Java Java・配列の問題です。 int 「」nums = new int「5」 ⤴︎ この5の事を言葉で 2 2023/06/21 22:30
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java Java 配列<選挙> 4 2023/07/31 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
構造体のextern方法
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
std::for_eachに、ループカウン...
-
C言語 ファイルの指定された行...
-
2次元配列のnew
-
c言語
-
C言語の課題が出たのですが自力...
-
配列のアドレス部
-
C言語の配列のコピーについて
-
C#で配列が空かを判定するには?
-
C言語で重複組合せを全列挙
-
MFC - ダイアログボックスのPic...
-
C#で構造体の配列を持った構造...
-
この変数名はわかりにくいですか?
-
c言語 構造体
-
C#でのフィボナッチ数列
-
AfxBeginThread の引数について
-
Cのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語 ファイルの指定された行...
-
C言語についてです 5人のテスト...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報