0

Simulinkを使用しなければならない状況に遭遇しました。

データを含むcsvファイル(1000行x 6列)があります。csvファイルの列6を検索し、探しているものに最も近いものを見つけて、列1 234を返す必要があります。

簡単にするために、私の問題のより小さなバージョンで行きましょう。

Csvファイルの例

0  0  0  0 0 20
0 10 15  2 4 30
1 50  2 54 2 40

21を検索します。行1、列6が21に最も近いことがわかります。次に、0 0 0 0(最初の4列)を返します。

34を検索すると、行3、列6が34に最も近いことがわかります。次に、1 50254を返します。

うまくいけば、それは私が必要なものを説明しています。

もともと私はfind(..)を使用してmatlabで動作するスクリプトを作成し、それは動作しましたが、これsimulinkを使用して実行する必要があります。

動作する2Dループアップテーブルブロックがあることに気づきましたが、事前にインデックスを知る必要があるようです。

誰かが私が使用できるブロックの正しい方向に私を向けることができ、そして私がそれらを使用する方法についてグーグルで回ることができれば、それは大いにありがたいです。

4

2 に答える 2

2

コメントで述べたように、既存の関数を Simulink モデルに組み込むために、 Matlab Function ブロックまたはInterpreted Matlab Functionブロックを使用することをお勧めします (必要がなければ、車輪を再発明する必要はありません)。 )。

これが「すべて Simulink」でなければならない (つまり、ユーザー定義のブロックがない) という制約の下で作業している場合、おそらく役立ついくつかのブロックはSelectorFindMin、およびCompare To Zeroです。

私が取る可能性のあるアプローチの 1 つは、セレクターを使用してその 6 番目の列を分離することです。列の各値と一致させようとしている値の間の「エラー」を見つけます (つまり、差の絶対値を取ります)。Minブロックを使用して最小誤差を見つけます。最も近い一致のインデックスの値が 0 になるように、エラーのベクトルからその最小エラーを減算します。 と を使用するCompare To ZeroFind、最も近い一致のインデックスを決定できるはずです。それを取得したら、それを使用して別のSelectorブロックを駆動し、必要に応じて要素を選択できます。

私が考えることができる他のブロックがあり、それは本当に役立つかもしれません ( Find Local Maximaは、解決策に組み込むことができると思います)。ただし、追加のツールボックスが必要です。

于 2012-10-14T17:17:51.947 に答える
0

これは、 Minimumブロックを使用して実現できます。モードindexに設定して、エラーが最小の項目のインデックスを出力するようにします。

In1を介して元の行/列を取得し、Idxの最小値のインデックスを取得して、このインデックスをVariable Selectorブロックに渡します。

于 2016-02-23T23:08:25.747 に答える