n次正方行列X=(xij),Y=(yij)の積XYの(i,j)成分はΣ(k=1,n)xikykjで定義する。これをmin{k∈1,2,…n}(xik+ykj)と変更したとき行列の積を計算するプログラムの作成をしたいです。
※minXは、Xの中の最小値を意味する。
十進BASICで解きたいのですが、以下のプログラムで間違いがあったら指摘してただけないでしょうか?よろしくお願いします。
INPUT N
DIM X(n,n)
DIM Y(n,n)
DIM Z(n,n)
INPUT X(n,n)
INPUT Y(n,n)
FOR i = 1 TO n
FOR j = 1 TO n
LET Z(i,j) = X(i,1) * Y(1,j)
FOR k = 2 TO n
IF Z(i,j) > X(i,k) * Y(k,j) THEN LET Z(i,j) = X(i,k) * Y(k,j)
NEXT k
NEXT j
NEXT i
INPUT Z(n,n)
END
No.2ベストアンサー
- 回答日時:
これ前やったなあ。
僕の場合はScheme(Lispの一方言)で書いたんですけど、恐らくBASICで書く以上、「殺人的な長さ」になると思います。
まあ、僕はBASICは良く知らんので、入出力関係ですと、ANo.1さんの方を参照して欲しいんですが、一応ロジックで気づいた事を挙げていきます。
9行目:
LET Z(i,j) = X(i,1) * Y(1,j)
そもそもここが違います。
題意では、
min{k∈1,2,…n}(xik+ykj)
でないとならないので、そもそも掛け算を用いません。
また、配列Zのi行j番目にいきなり計算結果を代入するのも間違っています。
題意的には、例えば4行4列の計算結果、Z_{1,1}に当たる数値の候補は
Z_{1,1}=min{x_{1,1}+y_{1,1},x_{1,2}+y_{2,1},x_{3,1}+y_{1,3},x_{1,4}+y_{4,1}}
の4つあって、この4つの中から「最小の値」をZ_{1,1}として返さないといけません。つまり、この作業をn行n列の行列Zに対して「全て」やらないとならないのです。
もうちょっと具体的に見てみましょうか?
例えば4行4列の行列Xが、十進BASICの記法を真似ると、
MAT X = 1,0,2,0,0,1,0,2,2,0,1,0,0,2,0,1
で、同様に4行4列の行列Yが、
MAT Y = 16,3,2,3,5,10,11,8,9,6,7,12,4,15,14,1
だった場合、出力結果の行列Zは
MAT Z = 4,4,3,1,6,3,2,3,4,5,4,1,5,3,2,2
でないとなりません。
何故なら先ほどの定義により、例えばZ_{1,1}は
Z_{1,1}=min{1+16, 0+5 , 2+9 , 0+4}
となり(MAT Yの要素を4つづつに分けて、その先頭要素が計算に使われていることに注意!)「その中の最小値」の4がZ_{1,1}の計算結果として出力されます。
どのXの要素とどのYの要素が計算に使われるのか、は普通の「行列の積」に従ってるんですけど、この問題の場合、根本的にn行n列同士の計算を行うと、各要素に対してなおかつ「n個の要素から」最小値を返す、ってのが題意です。
従って、例示したプログラムにはその計算過程が組み込まれていないように見受けられます。
根本的なロジックを見直した方が良いでしょうね。
No.3
- 回答日時:
No.1です。
No.2さんの回答でmin{k∈1,2,…n}(xik+ykj)の意味がわかりました。
それならば簡単なことです。
FOR~NEXT内の乗算(*)を加算(+)に変えるだけです。
No.2さんの提示した例を入力しましたが、正しい結果が出力されましたよ。
No.1
- 回答日時:
minXの定義がいまいちわからないので、プログラムの内容ではなく文法へのアドバイスをします。
十進BASICでは、配列へ数値を入力するのはMAT INPUT文を使います。
n=2ならば、5,4,9,3のように配列の要素分の数値をカンマで区切って入力します。
最後のINPUT Z(n,n)は出力だと思います。
MAT PRINT文を使います。
INPUT N
DIM X(n,n)
DIM Y(n,n)
DIM Z(n,n)
MAT INPUT X
MAT INPUT Y
FOR i = 1 TO n
FOR j = 1 TO n
LET Z(i,j) = X(i,1) * Y(1,j)
FOR k = 2 TO n
IF Z(i,j) > X(i,k) * Y(k,j) THEN LET Z(i,j) = X(i,k) * Y(k,j)
NEXT k
NEXT j
NEXT i
MAT PRINT Z
END
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
タクシー料金の問題です
-
継承元と継承先での変数
-
VBでReplace
-
変化させるセルが変化しない
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
三菱シーケンサー works2 の日...
-
切り上げたい
-
BASICでモンテカルロ法
-
計算式の文字列を解析して自分...
-
再帰呼び出しを用いるnPk,nCk ...
-
CとFORTRANの計算速度はどちら...
-
ExcelのマクロVBA動作を軽くす...
-
MATLABの積分について
-
時間計算量、空間計算量とは何...
-
社会人だがMatlabを個人用に使...
-
fortran dlog2
-
C# 計算処理中に実行中ウィン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
排他的論理和 BCC(水平パリテ...
-
VBAの再計算が反映されない件に...
-
バッチファイルでウインドウを...
-
変化させるセルが変化しない
-
EXCELなどで「返す」という表現
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
Visual C++でdebugとreleaseで...
-
モジュラス103の計算とは何でし...
-
なぜオーバーフローになるので...
-
VB6で正確なミリ秒を計測したい...
-
VBでReplace
-
引き放し法による除算アルゴリ...
-
matlabで計算終了
-
CRC8を教えてください
-
VBAで関数をつくる
-
Excel VBAの残業時間の合計計算...
-
等高線を計算したい
おすすめ情報