for i=1:100
x(i)=normrnd(0,1);
end;
A=x(:);
for i=1:100
if (A(i)<0.9557 & A(i) > 0)
Aq(i)=0.497;
elseif (A(i)>0.9957)
Aq(i)=1.493;
elseif (A(i)<-0.9957)
Aq(i)=-1.493;
else
(A(i)>-0.9957 & A(i) <0)
Aq(i)=-0.497;
end;
end;
sum=0;
for i=1:100
sum = (A(i)-Aq(i))^2+sum;
end;
Avg = sum/100

2 件のコメント

Geoff Hayes
Geoff Hayes 2020 年 4 月 3 日
Mohamed - look closely at your else
else
(A(i)>-0.9957 & A(i) <0)
Aq(i)=-0.497;
end;
Should this be an elseif instead where (A(i)>-0.9957 & A(i) <0) is the condition?
Mohamed Mahir
Mohamed Mahir 2020 年 4 月 3 日
Thank you very much it fixed it

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

 採用された回答

Steven Lord
Steven Lord 2020 年 4 月 3 日

1 投票

Another approach uses discretize.
>> A = randn(10, 1);
>> edges = [-Inf -0.9957 0 0.9957 Inf];
>> values = [-1.493, -0.497, 0.497, 1.493];
>> Aq = discretize(A, edges, values);
>> results = table(A, Aq)
If an element of A falls between (for example) edges(2) and edges(3) the corresponding element in Aq will be values(2).
I put the results in a table array so you can easily check that each element of Aq matches what it should be for the corresponding element of A.

1 件のコメント

Mohamed Mahir
Mohamed Mahir 2020 年 4 月 3 日
Thank you that really helped me

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

その他の回答 (1 件)

David Hill
David Hill 2020 年 4 月 3 日
編集済み: David Hill 2020 年 4 月 3 日

0 投票

Much easier way:
A=normrnd(0,1,[100,1]);
[~,~,a]=histcounts(A,[-10,-.9957,0,.9957,10]);
b=[-1.493;-0.497;0.497;1.493];
Aq=b(a);
s=sum((A-Aq).^2);
Avg = s/100;

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by