Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2023.1.0 - 日本語


corr

相関 , 共分散

呼び出し手順

[cov,Mean] = corr(x,[y],nlags)
[cov,Mean] = corr('fft',xmacro,[ymacro],n,sect)
[w,xu] = corr('updt',x1,[y1],w0)
[w,xu] = corr('updt',x2,[y2],w,xu)
...
wk = corr('updt',xk,[yk],w,xu)

引数

x

実数ベクトル

y

実数ベクトル, デフォルト値 x.

nlags

i整数, 指定した相関係数の数.

xmacro

scilab 外部ルーチン (下記参照).

ymacro

scilab 外部ルーチン (下記参照), デフォルト値: xmacro

n

整数, シーケンス全体の大きさ (下記参照).

sect

シーケンスのセクションの大きさ (下記参照).

xi

実数ベクトル

yi

実数ベクトル,デフォルト値: xi.

cov

実数ベクトル, 相関係数

Mean

実数または実数ベクトル, x (および y)の平均

説明

corr(x,y,…) computes cov(m)=sum_{k=1}^{n-m} (x(k)-mean(x))(y(m+k)-mean(y)) / n for m = 0, …, nlag-1.

シーケンス x および y が異なる場合, corr(x,y,...)はcorr(y,x,...) と異なることに注意してください.

短いシーケンス

[cov,Mean]=corr(x,[y],nlags) は, 最初の nlags 個の相関係数および Mean = mean(x) (y が引数として指定された場合,[x,y] の平均) を返します. シーケンス x (または y) は実数, xyは同じ次元 n と仮定されます.

長いシーケンス

[cov,Mean]=corr('fft',xmacro,[ymacro],n,sect) ここで,xmacro は以下のどちらかです

  • [xx]=xmacro(sect,istart) という型の関数で, istart から istart+sect-1までの添字を有するシーケンスの 一部を含む nsect次のベクトルxxを返します.

  • FortranサブルーチンまたはCプロシージャで, 同じ計算を行ないます(例えば,dgetxの ソースコードを参照ください).

n = シーケンスの総数. sect = シーケンスのセクションの大きさ. sect は 2の累乗とする必要があります. covsect次です. 計算は FFT により行われます.

更新法
[w,xu]=corr('updt',x1,[y1],w0)
[w,xu]=corr('updt',x2,[y2],w,xu)
 ...
wk=corr('updt',xk,[yk],w,xu)

この呼び出し手順では,計算結果がcorrをコールする度に 更新されます.

w0 = zeros(1, 2 * nlags);
nlags = power of 2.

x1,x2,... は, x=[x1,x2,...]で,xiの大きさが 2の累乗となるようなx の一部です. nlags個の係数を得るには, 最後の fft を c=fft(w,1)/n; cov=c(1nlags)を実行する必要があります (nx (y)の大きさ). 注意: この呼び出し手順は xmean = ymean = 0 を仮定します.

x = %pi/10:%pi/10:102.4*%pi;
rand('seed');
rand('normal');
y = [.8 * sin(x) + .8 * sin(2*x) + rand(x); .8 * sin(x) + .8 * sin(1.99*x) + rand(x)];
c = [];
for j = 1:2
    for k = 1:2
        c = [c; corr(y(k, :), y(j, :), 64)];
    end
end
c = matrix(c, 2, 128);
cc = [];
for j = 1:64
    cc = [cc; c(:, (j - 1) * 2 + 1:2 * j)];
end

rand('seed');
rand('normal');
x = rand(1, 256);
y = -x;
deff('[z] = xx(inc, is)','z = x(is:is+inc-1)');
deff('[z] = yy(inc, is)','z = y(is:is+inc-1)');
[c, mxy] = corr(x, y, 32);
x = x - mxy(1) * ones(x);
y = y - mxy(2) * ones(y);  //centring
c1 = corr(x, y, 32);
c2 = corr(x, 32);
norm(c1 + c2, 1)
[c3, m3] = corr('fft', xx, yy, 256, 32);
norm(c1 - c3, 1)
[c4, m4] = corr('fft', xx, 256, 32);
norm(m3, 1)
norm(m4, 1)
norm(c3 - c1, 1)
norm(c4 - c2, 1)
x1 = x(1:128);
x2 = x(129:256);
y1 = y(1:128);
y2 = y(129:256);
w0 = zeros(1, 64);
[w1, xu] = corr('u', x1, y1, w0);
w2 = corr('u', x2, y2, w1, xu);
zz = real(fft(w2, 1)) / 256;
c5 = zz(1:32);
norm(c5 - c1, 1)
[w1, xu] = corr('u', x1, w0);
w2 = corr('u', x2, w1, xu);
zz = real(fft(w2, 1)) / 256;
c6 = zz(1:32);
norm(c6 - c2, 1)

// Fortran または C 外部ルーチンのテスト
deff('[y] = xmacro(sec, ist)','y = sin(ist:(ist+sec-1))');
x = xmacro(100, 1);
[cc1, mm1] = corr(x, 2^3);
[cc, mm] = corr('fft', xmacro, 100, 2^3);
[cc2, mm2]=corr('fft', 'corexx', 100, 2^3);
[max(abs(cc - cc1)), max(abs(mm - mm1)), max(abs(cc - cc2)), max(abs(mm - mm2))]

deff('[y] = ymacro(sec, ist)','y = cos(ist:(ist+sec-1))');
y = ymacro(100, 1);
[cc1, mm1] = corr(x, y, 2^3);
[cc, mm] = corr('fft', xmacro, ymacro, 100, 2^3);
[cc2, mm2] = corr('fft', 'corexx', 'corexy', 100, 2^3);
[max(abs(cc - cc1)), max(abs(mm - mm1)), max(abs(cc - cc2)), max(abs(mm - mm2))]

参照

  • xcorr — 離散自己/相互相関を計算する
  • xcov — 離散自己/相互共分散を計算する
  • correl — 2つの変数の相関
  • cov — Sample covariance matrix
  • covar — 2つの変数の共分散
Report an issue
<< convol2d Correlation Convolution hank >>

Copyright (c) 2022-2024 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon May 22 12:43:10 CEST 2023