範囲を指定して最頻値

4 ビュー (過去 30 日間)
Ochi Kai
Ochi Kai 2022 年 9 月 7 日
コメント済み: Ochi Kai 2022 年 9 月 7 日
例えばA=[1,1,1,1,5, 2,2,2,2,3, 4,4,1]といった13×1の変数があるとします。
これらを上から順に5行毎に分けその最頻値を取りたいです。今回の場合はB=[1, 2, 4]といった感じで、最後は割り切れないがそのまま出力したいと思っています。
mode関数がよいようなのですが、以下のようにプログラムして上手くいきません。ご教授いただけると幸いです。よろしくお願いいたします。
for i = 1:length(A):5
k=i+4;
l=mode(A(i:k,:),2);
end

採用された回答

Hernia Baby
Hernia Baby 2022 年 9 月 7 日
まずは準備します。
A = [1;1;1;1;5;2;2;2;2;3;4;4;1];
sz_A = size(A)
sz_A = 1×2
13 1
ここがミソになります。
remで余りを算出し、それを割る数(ここでは5)から引くと足りない数が出ます。
その分だけNaNを埋め込みます。そしてreshapeで5行×n列の行列に変換します。
num = 5;
B = [A;nan(num - rem(sz_A(1),num),1)];
B_re = reshape(B,5,[])
B_re = 5×3
1 2 4 1 2 4 1 2 1 1 2 NaN 5 3 NaN
modeはNaNを無視するのでそのまま使えます。
MODEs = mode(B_re)
MODEs = 1×3
1 2 4
  6 件のコメント
Hernia Baby
Hernia Baby 2022 年 9 月 7 日
すみません、一部間違えていました…
以下のコードになります
clear,clc;
A = readmatrix('saihin.csv');
Y = length(A)/50;
Y = fix(Y);
Y = Y + 1;
X = zeros(Y,1);
m = 1;
for ii = 1:50:length(A)
k = ii + 49;
if k > length(A)
X(m,1)=mode(A(ii:length(A),1));
else
X(m,1)=mode(A(ii:k,1));
end
m = m + 1;
end
X'
ans = 1×100
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Ochi Kai
Ochi Kai 2022 年 9 月 7 日
解決いたしました!いくつかの質問にも答えていただいて本当にありがとうございます。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ

製品


リリース

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!