float型だと手計算と一致せず、double型だと手計算と一致したのでdouble型にしました。
でも、三回目の計算がまったくあたらないので注意です。
後、計算が遅いです。
数値は、なんでも言いわけではなさそうだった。で、現状方程式で解いてる。(3Dグラフィックスのための数学では普通に4x4の計算をしている。)
c
1double a[16]={ 21.000000,0.000000,0.000000,0.000000, 30.000000,1.000000,0.000000,0.000000, 40.000000,0.000000,1.000000,0.000000, 50.000000,0.000000,0.000000,1.000000}; 6 7 8double b[16]={ 91.000000,0.000000,0.000000,0.000000, 100.000000,1.000000,0.000000,0.000000, 110.000000,0.000000,1.000000,0.000000, 120.000000,0.000000,0.000000,1.000000}; 13
で数値は何でもいいとして
**a×bの
4×4の行列(間違えたら嫌なので強調)**を算出する簡単な方法がありましたら、教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 23:57
2020/08/09 01:54
2020/08/09 02:05
2020/08/09 02:06
2020/08/09 02:27
2020/08/09 02:36

回答9件
0
Frame_Scene_Root[0]とFrame_body[0]がfloat型にできなかったんだが、元の値が変わってしまうのですがどうすべきでしょうか。
なに言ってるかわからん。
投稿2020/07/04 00:12
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
a×bの 4×4の行列(間違えたら嫌なので強調)を算出する簡単な方法がありましたら
何らかのライブラリを使う,という方法.(マジレス)
一体何のために行列計算しているのかわからないけれども,その行列を使う目的によっては何らかのライブラリを導入している可能性があり,そうであって且つそこに行列を扱う機能が提供されているならばそれを使うのが手っ取り早い.
OpenCVとかEigenなら,行列用の型にoperator *
が提供されているから,
A * B
とか書けばそれで済む.
OpenGLにはglMultMatrix
なんてのがあるみたい(掛ける方向とか行列データの並び順とかの面が若干面倒そうかもだが).
投稿2020/08/03 01:28
総合スコア12229
0
評価する人は自前に 4*4のコードを作成し書き込んでいけっていったんだから、書き込んでいけよ。
php
1 2<?php 3$intA = [ 43, 4, 5, 5, 56, 3, 4, 3, 63, 4, 5, 7, 79, 2, 3, 4 8]; 9 10$intB = [ 113, 4, 5, 5, 126, 3, 4, 3, 133, 4, 5, 7, 149, 2, 3, 4 15]; 16 17$result = []; 18 19for( $i = 0; $i < 16; $i++ ){ 20 $result[] = $intA[$i] * $intB[$i]; 21} 22 23for( $i = 0; $i < 4; $i++ ){ 24 for( $j = 0; $j < 4; $j++ ){ 25 echo $result[ ($i * 4) + $j ], ' '; 26 } 27 echo '<br />'; 28} 29
もうすぐ定期試験2科目始まるのでレスは遅れますが悪しからず。
投稿2020/08/03 00:51
編集2020/08/03 00:52総合スコア10434
0
ベストアンサー
簡単もなにもベクトルの内積を4x4回繰り返す以外なんかあるん?
[追記] 愚直な実装でよければ:
C
1#include <stdio.h> 2 3#define at(t,y,x) t[y*4+x] 4 5int main() { 6 float a[16] = { 7 1.000000,0.000000,0.000000,0.000000, 8 0.000000,1.000000,0.000000,0.000000, 9 0.000000,0.000000,1.000000,0.000000, 10 0.000000,0.000000,0.000000,1.000000 }; 11 12 float b[16] = { 13 1.000000,0.000000,0.000000,0.000000, 14 0.000000,1.000000,0.000000,0.000000, 15 0.000000,0.000000,1.000000,0.000000, 16 0.000000,0.000000,0.000000,1.000000 }; 17 18 float c[16]; 19 20 int row, col; 21 for ( row = 0; row < 4; ++row ) { 22 for ( col =0; col < 4; ++col ) { 23 float sum = 0.0f; 24 int t; 25 for ( t = 0; t <4; ++t ) { 26 sum += at(a,row,t) * at(b,t,col); 27 } 28 at(c,row,col) = sum; 29 } 30 } 31 32 // できたかな? 33 for ( row = 0; row < 4; ++row) { 34 for ( col = 0; col < 4; ++col) { 35 printf("%f ", at(c,row,col)); 36 } 37 puts(""); 38 } 39 return 0; 40}
投稿2020/07/03 11:32
編集2020/07/03 12:22総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
解決したんじゃなかったんか?
a[4][4] と b[4][4] の積を c[4][4] に求める:
C
1#include <stdio.h> 2 3void multiplies(float c[4][4], const float a[4][4], const float b[4][4]) { 4 int row, col; 5 for ( row = 0; row < 4; ++row ) { 6 for ( col =0; col < 4; ++col ) { 7 float sum = 0.0f; 8 int t; 9 for ( t = 0; t <4; ++t ) { 10 sum += a[row][t] * b[t][col]; 11 } 12 c[row][col] = sum; 13 } 14 } 15} 16 17int main() { 18 float a[4][4] = { 19 { 1.000000,0.000000,0.000000,0.000000 }, 20 { 0.000000,1.000000,0.000000,0.000000 }, 21 { 0.000000,0.000000,1.000000,0.000000 }, 22 { 0.000000,0.000000,0.000000,1.000000 }, 23 }; 24 25 float b[4][4] = { 26 { 1.000000,0.000000,0.000000,0.000000 }, 27 { 0.000000,1.000000,0.000000,0.000000 }, 28 { 0.000000,0.000000,1.000000,0.000000 }, 29 { 0.000000,0.000000,0.000000,1.000000 }, 30 }; 31 32 float c[4][4]; 33 34 int row, col; 35 36 multiplies(c, a, b); 37 38 // できたかな? 39 for ( row = 0; row < 4; ++row) { 40 for ( col = 0; col < 4; ++col) { 41 printf("%f ", c[row][col]); 42 } 43 puts(""); 44 } 45 return 0; 46}
投稿2020/08/02 23:51
編集2020/08/02 23:55総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
[別解] 関数 multiplies に仕立ててみた
C
1#include <stdio.h> 2 3#define at(t,y,x) t[y*4+x] 4 5void multiplies(float* c, const float* a, const float* b) { 6 int row, col; 7 for ( row = 0; row < 4; ++row ) { 8 for ( col =0; col < 4; ++col ) { 9 float sum = 0.0f; 10 int t; 11 for ( t = 0; t <4; ++t ) { 12 sum += at(a,row,t) * at(b,t,col); 13 } 14 at(c,row,col) = sum; 15 } 16 } 17} 18 19int main() { 20 float a[16] = { 21 1.000000,0.000000,0.000000,0.000000, 22 0.000000,1.000000,0.000000,0.000000, 23 0.000000,0.000000,1.000000,0.000000, 24 0.000000,0.000000,0.000000,1.000000 }; 25 26 float b[16] = { 27 1.000000,0.000000,0.000000,0.000000, 28 0.000000,1.000000,0.000000,0.000000, 29 0.000000,0.000000,1.000000,0.000000, 30 0.000000,0.000000,0.000000,1.000000 }; 31 32 float c[16]; 33 34 int row, col; 35 36 multiplies(c, a, b); 37 38 // できたかな? 39 for ( row = 0; row < 4; ++row) { 40 for ( col = 0; col < 4; ++col) { 41 printf("%f ", at(c,row,col)); 42 } 43 puts(""); 44 } 45 return 0; 46}
投稿2020/07/04 07:49
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
いたらなかったため削除します
投稿2020/07/04 05:11
編集2021/03/09 12:14総合スコア304
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/04 05:14
2020/07/04 07:51
2020/08/04 22:16
2020/08/04 22:21

0
const char * char * const char * const
投稿2020/07/04 01:24
総合スコア190
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/04 01:44
2020/08/02 22:22
2020/08/02 22:52
2020/08/02 22:53
2020/08/02 23:05
2020/08/02 23:12 編集
2020/08/02 23:13
2020/08/02 23:18
2020/08/02 23:20 編集
2020/08/02 23:41
2020/08/02 23:51
2020/08/02 23:58
2020/08/03 00:06
2020/08/03 00:09
2020/08/03 00:16
2020/08/03 00:18
2020/08/03 00:31
2020/08/03 01:59
2020/08/03 02:21
2020/08/03 21:37
2020/08/04 04:54
2020/08/04 05:12
2020/08/04 06:31
2020/08/04 06:37 編集
2020/08/04 06:40
2020/08/04 06:40
2020/08/04 06:44
2020/08/04 06:47
2020/08/04 09:48 編集

0
いたらなかったため削除します。
投稿2020/07/03 16:53
編集2021/03/09 12:11総合スコア304
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2020/07/04 17:26

退会済みユーザー
2020/07/04 17:41

退会済みユーザー
2020/11/26 13:47 編集
2020/08/03 00:59
2020/08/03 01:12

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。