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

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

新規登録して質問してみよう
ただいま回答率
85.37%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

10932閲覧

エラー表示:配列インデックスは正の整数または logical 値でなければなりません。

kaeruuuun

総合スコア19

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/21 00:36

編集2021/04/21 09:06

イメージ説明[イメージ説明])### 前提・実現したいこと
初心者です.
MATLABでconvを使わずに畳み込み積分をしたいです.

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

y(n)=の式において
配列インデックスは正の整数または logical 値でなければなりません。
と表示されます.何が問題なのでしょうか.

エラーメッセージ 配列インデックスは正の整数または logical 値でなければなりません。 y(n)=y(n)+g(k)*x(n-k+1); ### 該当のソースコード MATLAB [x fs]=audioread('*****'); n_length=length(x); [g fs]=audioread('*****'); g_length=length(g); y=zeros(1,n_length+g_length-1); for n=1:n_length for k=1:n_length-g_length+1 y(n)=y(n)+g(k)*x(n-k+1); end end ソースコード

試したこと

x(n-k+1)の中身を変更したりしましたが,どうしても0になります.

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

MATLAB

1 2for n=1:n_length + g_length -1 3 4 if n>n_length 5 left = n-n_length+1; 6 else 7 left=1; 8 end 9 if n < g_length 10 right = n; 11 else 12 right = g_length; 13 for k=left:right 14y(n)=y(n)+g(k)*x(n-k+1); 15 16 17 end 18 19end
ここにより詳細な情報を記載してください。 教えていただいたように修正したのですがこのプログラムだとgがxより小さい時しか動作しません.常に成り立つプログラムにするにはどのように変更すれば良いでしょうか」.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答2

0

ベストアンサー

xの要素の個数が4個、gの個数が3個の場合を例にとって説明します。

gが左から右へ動いて行ったときの重なり具合を見てみると、

1回目 [x x x x] [g g g] 重なりは1個 2回目 [x x x x] [g g g] 重なりは2個 3回目 [x x x x] [g g g] 重なりは3個 4回目 [x x x x] [g g g] 重なりは3個 5回目 [x x x x] [g g g] 重なりは2個 6回目 [x x x x] [g g g] 重なりは1個

という風にgが左端にあるときと右端にあるときは、重なる個数が減るのですが、それが考慮されていないので、配列の範囲をはみ出たところをアクセスしてしまっています。

重なる個数を考慮に入れたループをベタに書くと

MATLAB

1for n = 1:n_length+g_length-1 2 if n > n_length 3 left = n - n_length + 1; 4 else 5 left = 1; 6 end 7 if n < g_length 8 right = n; 9 else 10 right = g_length; 11 end 12 for k = left:right 13 y(n) = y(n) + g(k) * x(n-k+1); 14 end 15end

投稿2021/04/21 03:25

Bearded-Ockham

総合スコア430

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

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

kaeruuuun

2021/04/21 06:34 編集

コメントありがとうございます.上手く畳み込み積分できました.ありがとうございます.ただ初心者ということもありあまり理解が追いついていないので可能であれば,プログラムの説明をより詳しくしていただけますでしょうか.
kaeruuuun

2021/04/21 12:08

上にも書いたのですが,gとxの大小関係が変わったときにうまく動作しません.改善策はありますでしょうか.
Bearded-Ockham

2021/04/21 17:09

conv関数と結果を比較してみましたか、多少の計算誤差はあるものの、有効数字13桁か14桁くらいで、ほぼ一致しています。どのように動作確認をしたのでしょうか。
kaeruuuun

2021/04/22 00:01

今一度計算したら上手く動作しました.お騒がせして申し訳ございません.ということはg_lengthとn_lengthの大きさの大小関係によらずこのプログラムは成立するということでしょうか.for文の前にまずg_lengthとn_lengthを比較するというif文を作成したのですが,これは不要ということでしょうか.動作確認はconvで出力した結果とこのプログラムの結果を重ね合わせて比較し,sound関数で音を聞きました.
kaeruuuun

2021/04/22 00:08

実は昨日実行したときにはこのプログラムで作成した音を聞くと最初の方がカットされた音になっていました.
guest

0

audioread でファイルを読み込めていないのでは?

投稿2021/04/21 01:00

yuki23

総合スコア1448

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

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

kaeruuuun

2021/04/21 01:04 編集

コメントありがとうございます.実際は****ではなくファイル名.wavにしているのでそこはあっていると思います.y(n)=y(n)+g(k)*x(n-k+1);にエラーが表示されます.forのなかでx(n-k+1)がどう計算しても0になってしまいます.
yuki23

2021/04/21 01:06

「あっていると思います」ではなく、変数の中身など結果を自分で見て、読み込めていることを確認してください。
kaeruuuun

2021/04/21 01:09

実際にconvを使って計算したら計算できているのであっています.
kaeruuuun

2021/04/21 01:10

convで計算したものをsound関数で音を聞きましたが,ちゃんと畳み込みできていました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問