0

以下は、2つの等しいサイズのベクトルXとYをとり、画像対応の単一相関係数を含むベクトルを返す関数です。この関数は、同じ大きさの2つのベクトルが与えられた場合に、matlabの組み込みcorr(X、Y)関数と同様に動作すると考えられます。今、私のコードは、単一の数値を含むベクトルではなく、複数の2数値ベクトルを含むベクトルを生成しています。これをどうやって解決するのですか?matlabに手動で相関係数を書き込むにはどうすればいいですか?

function result = myCorr(X, Y) 

meanX = mean(X); 
meanY = mean(Y); 
stdX = std(X); 
stdY = std(Y); 

for i = 1:1:length(X), 
    X(i) = (X(i) - meanX)/stdX; 
    Y(i) = (Y(i) - meanY)/stdY; 
    mult = X(i) * Y(i); 
end 

result = sum(mult)/(length(X)-1); 
end 

編集:私は画像強度値の等しいサイズのベクトルが与えられたとき、上記myCorr(X、Y)はMATLABのCORR(X、Y)で同じ出力を生成する明確にします。

編集2:出力ベクトルの形式は正しいですが、値は大きく外れています。

+0

可能な構文エラーを行うことができ、質問に言及した何をしたい場合は、これを行うと、しかし

r=(X-mean(X))*(Y-mean(Y))'/(sqrt(sum((X-mean(X)).^2))*sqrt(sum((Y-mean(Y)).^2))) 

に相当します。 'zx'と' zy'はループ内で特異値になります。私はそれらをベクターとして望んでいると仮定していますか? 'zx(i)'と 'zy(i)'?あなたはベクトル化したいものを計算するだけでループを避けることができます: 'zx =(X-meanX)/ stdX; zy =(Y-平均Y)/ stdY;また、MATLABのバージョンによっては、要素ごとの乗算を明示的に実行する必要があります: 'mult = zx。* zy;'。 – rayryeng

+0

私はいくつかの関数を更新しましたが、私はまだそれが正しい係数を返すとは思わない – Teej

+0

あなたの 'mult'も間違っています。これはループの最後にある1つの値を報告するだけです。 – rayryeng

答えて

1

r = corrcoef(X、Y)を使うことをお勧めします。これは、2x2の行列で探している正規化されたr値を与え、答えとしてr(2,1)を返すことができます。あなたが本当にあなたはまた

r=(X)*(Y)'/(sqrt(sum((X-mean(X)).^2))*sqrt(sum((Y-mean(Y)).^2))) 
+0

これらの関数がcorr関数よりも多くの値を持つ行列を出力しているかのようです。 – Teej

関連する問題