質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

5902閲覧

二次元配列を用いた行列の計算

rainrain

総合スコア31

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/08/02 06:54

以前私がした質問とほとんど重複したような質問なんですけど、
行き詰まったのでまた質問させていただきます。

3×3行列 R

3×1行列 x , t
がある時、
Rx - t
を計算したいです。

私なりにちょっと書いてみたので、以下に示します。
合っているかも見ていただきたいです(違っていたら正しい回答を教えていただきたいです)。

今、とある計算をして結果をファイルにはき出すプログラムを作っているんですけど、ありえない値が出てくるので原因を探しています。

###コード

float[][] A = new float[3][1]; //計算結果入れる用の配列 for(int i=0 ; i<3 ; i++){ for(int j=0 ; j<1 ; j++){ for(int k=0 ; k<3 ; k++){ A[i][j] += (R[i][k] * x[k][j]) - t[k][j];          //↑ここ合ってます? } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

変数kでループしているfor文の中で掛け算と引き算を同時にしていますが、
変数kでループしているfor文の中で計算するのは掛け算のみです

そもそも、行列の足し算、引き算は行列の同じ場所の成分どうしの足し算、引き算をすればいいですが、
掛け算は違いますよね。成分どうしの掛け算をするのですが、場所が異なります。

そのため、掛け算をするときは3重for文になっています。

(m * n行列で2重 + 掛け算の部分でさらにfor文が一つ追加 -> 合計3重for文)
そのため、掛け算をするときは3重for文になっています。

引き算の部分は一つ外のfor文(今回だと変数j)の中で計算しましょう。
(2重for文のところ)

java

1public class Main { 2 public static void main(String[] args) { 3 4 int [][]R = {{1,0,-1},{2,3,-2},{4,0,5}}; 5 int [][]x = {{1},{0},{-1}}; 6 int [][]t = {{-1},{2},{-3}}; 7 8 int [][]answer = new int[3][1]; 9 10 for(int i = 0; i < 3; i++){ 11 for(int j = 0; j < 1; j++){ 12 for(int k = 0; k < 3; k++){ 13 answer[i][j] += R[i][k] * x[k][j]; 14 } 15 answer[i][j] -= t[i][j]; 16 } 17 } 18 for(int i = 0; i < 3; i++){ 19 for(int j = 0; j < 1; j++){ 20 System.out.print(answer[i][j] + " "); 21 } 22 System.out.println(); 23 } 24 } 25}

<計算結果>
3
2
2

投稿2018/08/02 08:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

じっくりとコードを見ていないのですが、3段ループの一番内側でA[i][j] からt[k][j]を引いているので、tが3倍引かれていませんか?
Rxを計算してからtを引いた方が良いのでは。

投稿2018/08/02 08:18

kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tの要素をループ回数分引いてしまってます。
ループではまず行列の積を求めることに集中し、ループを抜けたあとで引き算をしましょう。

投稿2018/08/02 08:14

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

x, t が 3 × 1 の行列だとしたら、配列と考えればいいと思うので、インデックスは一つでいいんじゃないですか?

投稿2018/08/02 07:01

zvub1123

総合スコア230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainrain

2018/08/02 07:18

どのようにすればよいでしょうか? そうすることで計算結果は変わりますか?
zvub1123

2018/08/02 07:28

まず、確認したいんですが、Rx - t を求めたい、 という事であれば以下のようになると思っています。 認識は合っていますか? 例: R ---------------- | 3 | 2 | 4 | | 1 | ⑤| 6 | | 2 | 7 | 3 | ---------------- x[ 3, ④, 2] t[ ②, 6, 4] このような状態の時、丸の番号だけの結果を求めると、 5*4 - 2 = 18 となるはずです。
rainrain

2018/08/02 08:02

3行1列なので、 |〇| |〇| |〇| って感じです。 だから、Rx-tの計算結果も3行1列の行列になるはずです。
zvub1123

2018/08/02 08:10

なるほど、そうですね。失礼しました。 ちなみに「ありえない値」というのはどのようにありえない値なのでしょうか。 期待している結果がどのような値なのか、と 行列の一部と計算結果の一部を追記していただくことは可能ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問