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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

11回答

6745閲覧

要素数が同じ2つの配列を同じ添え字同士で掛け算したい

退会済みユーザー

退会済みユーザー

総合スコア0

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2016/02/26 05:50

要素数が同じ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ページで確認できます。

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

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

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

guest

回答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
rossi46hiro

総合スコア992

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

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

0

FORTRANという配列操作のために生まれたような言語があり、FORTRAN使うと一行です。

FORTRAN

1sum(M * N)

投稿2016/03/01 00:39

yuba

総合スコア5568

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

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

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

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2016/02/26 06:09

早速のご教示ありがとうございます!これからも勉強がんばります。
guest

0

たぶんこんな感じではないかと

Java

1int innerProduct = 0; 2 3for(int i = 0; i < N.size(); i++) { 4 innerProduct += N[i] * M[i]; 5}

投稿2016/02/26 06:00

issei.

総合スコア326

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

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

退会済みユーザー

退会済みユーザー

2016/02/26 06:09

早速のご教示ありがとうございます!これからも勉強がんばります。
issei.

2016/02/26 06:53

全員が別々の言語で回答したことに驚きました(たまたまですが)
guest

0

こんにちは。

被りそうな予感がひしひしとしますが、例えばCなら下記ですね。

C

1int result=0; 2for (int i=0; i < MAX; ++i) 3{ 4 result += N[i]*M[i]; 5}

投稿2016/02/26 05:59

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2016/02/26 06:09

早速のご教示ありがとうございます!これからも勉強がんばります。
guest

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

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2016/02/26 06:09

早速のご教示ありがとうございます!これからも勉強がんばります。
退会済みユーザー

退会済みユーザー

2016/02/26 06:11

みなさんベストアンサーに選びたいところですが、「ベクトルの内積」という言葉を教えていただいたコチラに押させていただきました。ありがとうございます。
ef3

2016/03/11 04:59

matrix を使わない場合の別解です。 a1 = [1, 2, 3] a2 = [4, 5, 6] p a1.zip(a2).map{|x, y| x * y }.inject{|s, n| s + n}
guest

0

perl ですが、

perl

1$sum = 0; 2for ( $i = 0 ; $i < 要素数 ; $i++ ) { 3 $sum += $N[$i] * $M[$i]; 4}

でどうでしょうか?
配列の要素番号を、同じ変数を使っています。

投稿2016/02/26 05:58

youji

総合スコア257

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

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

退会済みユーザー

退会済みユーザー

2016/02/26 06:10

早速のご教示ありがとうございます!これからも勉強がんばります。
guest

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
ozwk

総合スコア13521

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

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

0

いろんな言語あるのに R がない
ベクトル処理といえばコレだと思うのに

R

1c(1,2,3) %*% c(4,5,6) 2// 32

投稿2016/03/11 09:12

ryls-nmm

総合スコア633

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

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

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
ef3

総合スコア10

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

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

0

最近の java だと、ループを使わずに書くことができます。

java

1int[] v = {1, 2, 3}; 2int sum = Arrays.stream(v).map(x -> x * x).sum(); 3System.out.println(sum);

===>
問題を勘違いしました。2つの配列同士を掛け算するのでしたね...
===>
参考:

いろいろな言語での実装例があります。

投稿2016/02/26 14:00

編集2016/02/26 14:20
katoy

総合スコア22324

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

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

swordone

2016/02/26 14:02

これだとベクトル絶対値の2乗しか出せないのでは…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問