範囲を指定して最頻値

16 Ansichten (letzte 30 Tage)
Ochi Kai
Ochi Kai am 7 Sep. 2022
Kommentiert: Ochi Kai am 7 Sep. 2022
例えば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

Akzeptierte Antwort

Hernia Baby
Hernia Baby am 7 Sep. 2022
まずは準備します。
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 Kommentare
Hernia Baby
Hernia Baby am 7 Sep. 2022
すみません、一部間違えていました…
以下のコードになります
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 am 7 Sep. 2022
解決いたしました!いくつかの質問にも答えていただいて本当にありがとうございます。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Tags

Produkte


Version

R2022a

Community Treasure Hunt

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

Start Hunting!