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

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

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

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

Q&A

2回答

1113閲覧

逆行列についての問題 java

Rivia

総合スコア23

Java

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

1グッド

1クリップ

投稿2019/03/23 14:56

{3 7}
{1 2}の行列の逆行列を求めたいです。
実際求めることが出来たのですが、
答えと違ってしまいます。
実際の答えが
{-2 7}
{1 -3}ですが、私の作ったプログラムだと
{-2 7}
{1 -2}
になります。
恐らくは変数uの計算でなにかおかしくなっていると思うのですが、どうおかしいのか分かりません。
以下が私が作ったプログラムです。

java

1import java.util.Scanner; 2public class Program { 3 int num[][] = new int[2][2]; 4 double u; 5 6 public void input() { 7 num[0][0] = 3; 8 num[0][1] = 7; 9 num[1][0] = 1; 10 num[1][1] = 2; 11 u = (float)1/(num[0][0]*num[1][1]-num[0][1]*num[1][0]); 12 } 13 public void compute() { 14 num[0][0] = num[1][1]; 15 num[0][1] = -num[0][1]; 16 num[1][0] = -num[1][0]; 17 num[1][1] = num[0][0]; 18 for(int i=0;i<=1;i++) { 19 for(int j=0;j<=1;j++) { 20 num[i][j]=(int)u*num[i][j]; 21 } 22 } 23 System.out.print(num[0][0]+" "); 24 System.out.println(num[0][1]); 25 System.out.print(num[1][0]+" "); 26 System.out.print(num[1][1]); 27 } 28 public void output() { 29 30 31 } 32 public static void main(String[] args) { 33 Program p = new Program(); 34 p.input(); 35 p.compute(); 36 p.output(); 37 } 38}

よろしければご指摘いただけないでしょうか

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

computeメソッドの最初の4行

java

1 num[0][0] = num[1][1]; 2 num[0][1] = -num[0][1]; 3 num[1][0] = -num[1][0]; 4 num[1][1] = num[0][0];

この最初で(0,0)の要素が(1,1)の要素で書き換わってしまいます。その後(1,1)の要素が(0,0)の要素で書き換わりますが、これは最初に(0,0)にあった要素ではなく、最初に書き換えた(1,1)の要素だった数なので、結果的に元と変わりません。
新たな配列に格納するか、(0,0)と(1,1)を入れ替える際に別の変数を用意しておく必要があります。

投稿2019/03/23 16:02

swordone

総合スコア20651

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

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

Rivia

2019/03/23 16:24

input ↓ compute ↓ output ↓ の順番だから大丈夫だと思ったのですが、駄目なのでしょうか
Rivia

2019/03/23 16:26

上のふうに思っていたため、変数uを計算する際には問題ないと判断したのですが、 記述の上下はあまり関係ないのでしょうか
swordone

2019/03/23 16:35

この指摘のどこにもメソッドの順番は関係ないですし、変数uも全く関係ありません。回答をよく読んでください。
Rivia

2019/03/23 16:48

すみません。勘違いしてました。 ようやく分かりました。 一時的に値を避難させておく必要があるということですね。
guest

0

public void compute()内の以下の部分が想定と違う挙動をしていると思われます。

num[0][0] = num[1][1];
num[0][1] = -num[0][1];
num[1][0] = -num[1][0];
num[1][1] = num[0][0];

num[1][1]にnum[0][0]の値を移したいのだと思いますが、先にnum[0][0]=num[1][1]としてしまっているのでnum[0][0]がもはや元の値ではなくなっているのが問題ですね。
解決法としてはint tempを定義しておき、

temp=num[0][0];
num[0][0]=num[1][1];
num[1][1]=temp;

というようにしてやるとよいかと思います。

投稿2019/03/23 15:58

rausumaru

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問