
要素数が同じ2つの配列を、同じ添え字同士で掛け算したいのですが、プログラムではどう書けばいいでしょうか?
求めるものは
N[0]*M[0]+N[1]*M[1]+N[2]*M[2]+・・・・
というようなものです。
要素数は不特定です。
forループを2重にしてみたりしたのですが、
N[0]*M[0]+N[0]*M[1]+N[0]*M[2]+・・+N[5]*M[2]+・・・
などとなってしまい、求める結果になりません。。。。
アルゴリズムがわかれば言語はどれでも構いません。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答11件
0
Scalaの布教を
Scala
1val a = List(1, 2, 3, 4, 5) 2val b = List(6, 7, 8, 9, 10) 3a.zip(b).map{ i => i._1 * i._2 }.sum 4//=>130
Scalaの「_」は魔法の呪文です。
投稿2016/02/26 18:35
編集2016/03/11 04:15総合スコア992
0
2つの配列の同じインデックス(配列の中の位置)が同じ要素どうしを掛けたものを加えていけば良いのですから、forループは一重で足ります。
C言語だと、以下のような感じです。
C
1 ' 【前提】2つの配列の名前は、NとM、何らかの方法で配列の要素数が変数 sizeOfArray に事前に設定されているものとする。 2 total = 0; 3 for (i=0; i < sizeOfArray ; i++) 4 total += N[i] * M[i]; 5 'forループの実行が終わると、totalに結果が入っている。
投稿2016/02/26 06:05
総合スコア6919
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


0
ベストアンサー
このような、「同じサイズの1次元配列について、対応する要素同士をかけてその合計を出す」という演算は、ベクトルの内積と呼ばれ、数学的にもよく使われるものです。
最初からベクトル演算のライブラリがあるような言語なら、何も考えなくても実装できます。
ruby
1# 行列やベクトル関係のライブラリ 2require 'matrix' 3 4# 2本のベクトルを定義 5v1 = Vector[1,2,3] 6v2 = Vector[4,5,6] 7 8# 内積を計算して出力 9p v1.inner_product(v2)
投稿2016/02/26 05:58
総合スコア146532
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/02/26 06:09

退会済みユーザー
2016/02/26 06:11
2016/03/11 04:59

0
再帰使ってみました。
fsharp
1let innerProduct xs ys = 2 let rec ip a xs ys = 3 match (xs,ys) with 4 | ([],_) -> a 5 | (_,[]) -> a 6 | (x::xs, y::ys) -> ip (a + (x * y)) xs ys 7 ip 0 xs ys 8 9//要素数が同じとわかっているならこれでいい 10let innerProduct' xs ys = 11 List.fold2 (fun a x y -> a + x * y) 0 xs ys 12 13innerProduct [1;2;3] [4;5;6] |> printfn "%A" //32 14innerProduct [1;2;3] [4] |> printfn "%A" // 4
投稿2016/02/26 23:30
編集2016/02/26 23:32総合スコア13553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Python では NumPy を使うと dot 関数でベクトルの内積を求めることが出来ます。
python
1import numpy as np 2 3v1 = np.array([1,2,3]) 4v2 = np.array([4,5,6]) 5 6print np.dot(v1,v2)
NumPy を使わずイテレータを使った場合。
python
1a1 = [1,2,3] 2a2 = [4,5,6] 3 4print sum(map(lambda x, y: x * y, a1, a2))
リスト内包表現と zip の組み合わせの方が python ぽいかもしれません。
python
1reduce(lambda x, y: x + y, [x * y for x, y in zip(a1, a2)])
投稿2016/03/11 04:08
編集2016/03/11 07:25総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
最近の java だと、ループを使わずに書くことができます。
java
1int[] v = {1, 2, 3}; 2int sum = Arrays.stream(v).map(x -> x * x).sum(); 3System.out.println(sum);
===>
問題を勘違いしました。2つの配列同士を掛け算するのでしたね...
===>
参考:
- Vector products https://rosettacode.org/wiki/Vector_products
いろいろな言語での実装例があります。
投稿2016/02/26 14:00
編集2016/02/26 14:20総合スコア22328
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。