2016-07-24 3 views
0

行列ECoGとネストされた構造体TextMarkの両方を含む構造体があります。MATLAB:find関数を使用して大きなベクトルの特定の値の行番号を見つける

ECoGは、2つの列と多くの行(10798910x2倍)を持ちます。最初の列は信号の値を表し、2番目の列は時間を表します。

TextMarkは、timesおよびtextの2つのアレイを含む。 times(26x1 double)は、text(26x80文字配列)で表されるイベントに対応する時間値を含みます。

私はtextに特定の文字列のインデックスを検索し、timesで同じインデックスから時間値xを取るスクリプトを書いています。

ECoGの2番目の列にxがあり、値のインデックスを返します。

x = strmatch('example',output.TextMark.text) 
[y] = find(output.ECoG(:,2) == output.TextMark.times(x,:)) 

私はこれを実行すると、戻り値は

空行列である:しかし、私はoutput.TextMark.times(x,:)

x = strmatch('example',output.TextMark.text) 
[y] = find(output.ECoG(:,2) == 1.0219e+03) 
の既知の値を入力すると、0行1

戻り値はECoGの正しいインデックスです。

output.Textmark.times(x,:) = 1.0219e+03私は最初のコマンドが動作していない理由はわかりません。

答えて

0

私は2つのdouble要素を比較して問題の結果を推定します。
次のコード行をダブルクラスの2つの要素を比較しています
output.ECoG(:,2) == output.TextMark.times(x,:)
を問題の説明は、(多くのテキスト、およびいくつかの値を)混乱ビットであるので、私は私が正しくあなたを理解していなかった場合は謝罪しています...

==を使用して2つのdouble要素を比較すると、印刷時に2つの要素が同じに見える場合にfalseイベントが返されることがあります。

例:

a = 1 + 1e-10; 
b = 1 + 1e-11; 

あなたはaとbを表示すると、MATLABコマンドウィンドウで、あなたが得る:

a = 

    1.0000 

b = 

    1.0000 

をしかし、あなたはa == bを入力すると、あなたが得る:

あり
ans = 

    0 

等しいと思われる2つの二重要素が等しくない場合が多い。
Matalbの倍精度浮動小数点数の詳細については、http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.htmlを参照してください。
https://en.wikipedia.org/wiki/Floating_pointも読むことができます。https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=double%20precision%20matlab

: - (comparisonValueでtestValue)< = EPS(comparisonValue)

私はここから例を取っ

ABS:

2重の要素を比較するために、次の例を使用することができます

もう1つの解決策(コードサンプルを適用する):

関連する問題