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

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

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

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

Q&A

解決済

1回答

6474閲覧

MATLAB 行列から一番近い値をとる

progra

総合スコア51

MATLAB

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

0グッド

0クリップ

投稿2022/01/22 22:28

行列20×10のA行列があります。
A=[ 4.234 3.332 ....
........

ここから、数字 3.234に最も近い数字はA(3,4)にあるというように、インデックス(3,4)を取得したいです。
knnsearchでできるようで、

IDX = knnsearch(A, 3.234)

Y must be a matrix with 10 columns. といったようにエラーが出てしまいます。どのようにすればよいでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Idx = knnsearch(X,Y) は、 Y 内の各クエリ点に対する最近傍を X 内で探索し、列ベクトル Idx にインデックスを返します。 Idx の行数は Y と同じです。

matlab

1load hospital; 2X = [hospital.Age hospital.Weight]; 3Y = [20 162; 30 169; 40 168; 50 170; 60 171]; % New patients 4Idx = knnsearch(X,Y);

X — 入力データ
数値行列
入力データ。数値行列を指定します。 X の行は観測値に、列は変数に対応します。

Y — クエリ点
数値行列
クエリ点。数値行列を指定します。 Y の行は観測値に、列は変数に対応します。 Y の列数は X と同じでなければなりません。

https://jp.mathworks.com/help/stats/knnsearch.html

knnsearchの入力データは、列は変数に対応するようです。
引用した例では、年齢と体重の2つの変数があるようです。

今回の質問内容は、変数は1つのように思います。
knnsearchを使うのであれば、Aを1列に変換してからになりそうですかね。
引数の2つ目(Y)も数値行列で指定するみたいですね。
(knnsearchは変数1つでもOKなのでしょうか・・)


knnsearchを使わない形になりますが、今回の質問内容に近いページがMATLAB Answersにありました。

多次元の行列の最小値​や最大値、またその位​置を求めるにはどうす​ればよいですか?

例えば、多次元行列 "z" 全域から最小値を求めるためには、以下のように、コロン演算子を使って、入力する多次元配列をベクトル化します。

[C, I] = min(z(:))

これにより、min や max 関数で最小値、最大値を求めることができます。
この結果、インデックス I も 1 列データの何番目、となりますが、ind2sub 関数を使用して、元の (2次元の) z 行列のどの位置かを求めることができます。

>> z = rand(10) z = Columns 1 through 7 0.4173 0.7803 0.2348 0.5470 0.9294 0.6443 0.2077 0.0497 0.3897 0.3532 0.2963 0.7757 0.3786 0.3012 0.9027 0.2417 0.8212 0.7447 0.4868 0.8116 0.4709 0.9448 0.4039 0.0154 0.1890 0.4359 0.5328 0.2305 0.4909 0.0965 0.0430 0.6868 0.4468 0.3507 0.8443 0.4893 0.1320 0.1690 0.1835 0.3063 0.9390 0.1948 0.3377 0.9421 0.6491 0.3685 0.5085 0.8759 0.2259 0.9001 0.9561 0.7317 0.6256 0.5108 0.5502 0.1707 0.3692 0.5752 0.6477 0.7802 0.8176 0.6225 0.2277 0.1112 0.0598 0.4509 0.0811 0.7948 0.5870 0.4357 Columns 8 through 10 0.3111 0.5949 0.0855 0.9234 0.2622 0.2625 0.4302 0.6028 0.8010 0.1848 0.7112 0.0292 0.9049 0.2217 0.9289 0.9797 0.1174 0.7303 0.4389 0.2967 0.4886 0.1111 0.3188 0.5785 0.2581 0.4242 0.2373 0.4087 0.5079 0.4588 >> [C, I] = min(z(:)) C = 0.0154 I = 24 >> [ii, jj] = ind2sub(size(z), I) ii = 4 jj = 3

4 行 3 列の 0.0154 が最小となります。

https://jp.mathworks.com/matlabcentral/answers/403139-

単純に最小値を求めるのではなく、3.234との差の絶対値が最小のものを求める形に変えてあげればできそうかな?と思いました。

投稿2022/01/23 02:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

progra

2022/01/23 08:58

ありがとうございます。最後の"差の絶対値が最小のものを求める形"でできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問