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.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
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個の要素から」最小値を返す、ってのが題意です。
従って、例示したプログラムにはその計算過程が組み込まれていないように見受けられます。
根本的なロジックを見直した方が良いでしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
排他的論理和 BCC(水平パリテ...
-
Javaを使った行列計算
-
やってみてもわからないので教...
-
変化させるセルが変化しない
-
VBAでの勤務時間計算
-
Excel VBAの残業時間の合計計算...
-
[ASP]日付と時間の比較
-
ファイルから数式を読み込む
-
SNRの計算の仕方
-
C# 計算処理中に実行中ウィン...
-
MATLABの積分について
-
モジュラス103の計算とは何でし...
-
C言語で、漸化式を使ってパスカ...
-
VBAで関数をつくる
-
0xf0=256?
-
エクセルで特定のセルのみを任...
-
傾いた四角形内の範囲の条件式
-
VBとVBAの違い
-
Java 電卓の連続計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
C言語の課題で、1年の秒数を計...
-
バッチファイルでウインドウを...
-
骨折リスク評価のFRAXについて...
-
変化させるセルが変化しない
-
CとFORTRANの計算速度はどちら...
-
なぜオーバーフローになるので...
-
数値計算の高速化 (cos, sin, exp)
-
モジュラス103の計算とは何でし...
-
C# 計算処理中に実行中ウィン...
-
モジュロ
-
引き放し法による除算アルゴリ...
-
60進数の四則計算
-
C言語についてです。 再帰を使...
-
Perlで時間の計算
-
CRC8を教えてください
-
傾いた四角形内の範囲の条件式
おすすめ情報