0

MATLAB で次のエラーが発生しました。

??? 添え字のインデックスは、実数の正の整数または論理値のいずれかでなければなりません。

==> Lloyd_Max のエラー D(w_count) = mean((x - センター (xq)).^2);

これは私のコードです:

function [ xq,centers,D ] = Lloyd_Max( x,N,min_value,max_value )
%LLOYD_MAX Summary of this function goes here
%   Detailed explanation goes here

x = x';

temp = (max_value - min_value)/2^N;

count=1;
for j=0:temp:((max_value - min_value)-temp),
   centers(count) = (j + j + temp )/2;
   count = count + 1;
end

for i=1:length(centers),
   k(i) = centers(i); 
end


w_count = 0;

while((w_count < 2) || (D(w_count) - D(w_count - 1) > 1e-6))

    w_count = w_count + 1;

    count1 = 2;
    for i=2:(count-1),
       T(i) = (k(i-1) + k(i))/2;
       count1 = count1 +1 ;
    end

    T(1) = min_value;
    T(count1) = max_value; 

    index = 1;
    for j=2:count1,
        tempc = 0;
        tempk = 0;
        for k=1:10000,
            if(x(k) >= T(j-1) && x(k) < T(j))
                tempk = tempk + x(k);
                tempc = tempc + 1; 
            end
        end
        k(index) = tempk;
        k_count(index) = tempc;
        index = index + 1;
    end

    for i=1:length(k),
        k(i) = k(i)/k_count(i);
    end

    for i=1:10000,
        if (x(i) > max_value)
            xq(i) = max_value;
        elseif (x(i) < min_value)
            xq(i) = min_value;
        else
            xq(i) = x(i);
        end
    end

    for i=1:10000,
        cnt = 1;
        for l=2:count1,
           if(xq(i) > T(l-1) && xq(i) <= T(l))
               xq(i) = cnt;
           end
           cnt = cnt +1 ;
        end
    end

   D(w_count) = mean((x - centers(xq)).^2);

end



end

そして私はそれを呼び出して、これらの入力を持っています:

M = 10000
t=(randn(M,1)+sqrt(-1)*randn(M,1))./sqrt(2);
A= abs(t).^2;
[xq,centers,D] = Lloyd_Max( A,2,0,4 );

while と D にコメントしてみました。 結果 : xq とセンターはすべて正常で、xq は 1 ~ 4 の範囲、センターは 1 ~ 4 のインデックス、0.5 ~ 3.5 の範囲です。

ここで何が問題なのかわかりません...助けてください。

少し早いですがお礼を!

ミステリーは解決しました!

皆さん、助けてくれてありがとう!while から for ループを外しました:

for i=1:10000,
        if (x(i) > max_value)
            xq(i) = max_value;
        elseif (x(i) < min_value)
            xq(i) = min_value;
        else
            xq(i) = x(i);
        end
    end

そしてそれは魅力のように機能しました....このループは配列を再び初期化していました。そのために残念。ありがとうございました!

4

2 に答える 2

1

xq(i) = x(i)関数の途中のどこかに代入がありますが、によってサンプリングされる計算元の外部からとAして渡すため、整数であると約束することはできません。xAtrandnxq

于 2013-01-15T06:57:27.633 に答える
0

あなたが何を目指しているのか正確にはわかりませんが、ベクトルxqには整数が含まれておらず、倍精度が含まれています。のようにインデックスのベクトルを使用する場合は、ベクトルのcenters(xq)すべての要素が整数である必要があります。

少し調べてみると、xq は x の値のように見えます。それらが属する最も近いセルの整数にマップする方法を見つける必要があります (「中心」はセルの中心を表していると思いますか?)

于 2013-01-15T06:30:28.953 に答える