% member ship value taken by zeros initilization
U=zeros(2,3);
% **********************************************
% each row is randomly initialize and
% must be 1 [ i.e., summation of complete row value]
% **********************************************
for i=1:2
% for each i is 1 to 2, iteratively increased row
while(1)
total=0;
for j=1:3
U(i,j)=rand();
% generaly random value is less than one
total=total+U(i,j);
% each row, every colomn value is added to variable 'total'
end
if (total == 1)
% check value is equal to one or not,example total=1.1235
% then total considers as 1 but my point is exact total
% varible must be 'one'
break;
end
end
end
disp(U);
loop runs infinite so that please describe how to stop it

5 Kommentare

Adam
Adam am 5 Dez. 2016
while(1)
defines an infinite loop. It's always dangerous to do if you cannot be 100% certain that within the loop you have a guaranteed termination criterion.
my point, a row array is random generated value with keyword--> rand()
but all row values must be equal to 'one'.
ex:
col 1 col 2 col 3
row 1 : 0.1254 0.6412 0.23334
row 2 : 0.525 0.3500 0.125
row 1 : (0.1254+0.6412+0.23334)=1
row 2 : (0.525+0.3500+0.125)=1
Adam
Adam am 6 Dez. 2016
Bearbeitet: Adam am 6 Dez. 2016
Yes, but it doesn't take much to realise that will pretty much never happen, as Image Analyst points out. What do you think the percentage chance is of 3 totally random numbers of ~15 decimal places summing to exactly 1?, even before you take into account floating point inaccuracies within that sum even if they theoretically did sum to 1.
Thank You @Adam, I tried many times to do theoretically and finally I got practical implementation on the code. just while condition with flag variable assume as true, if inner condition fails then flag variable assume as false.......
function [U]=memv(mrow,k) % memv- fuzzy membership value [0,1] and mrow --> max rows of data % k --> no of clusters U=zeros(mrow,k);
for r=1:mrow % for each i is 1 to 2, iteratively increased row flag=true; while(flag) total=0; for cl=1:k
U(r,cl)=rand();
% generaly random value is less than one
total=total+U(r,cl);
% each row, every colomn value is added to variable 'total'
end
smallNeglate=0.00001;
if abs(total -1) <smallNeglate
% check total value is equal to one or not,example
% total=1.1235 in matlab then total considers as 1
% but my point is exact total varible must be 'one'
flag=false;
end
end
end % disp(U);
Image Analyst
Image Analyst am 7 Dez. 2016
I don't see any questions so I assume you have it solved now. However there is the implied question of "How do I format my code so it is readable?" and here is the answer to that question: http://www.mathworks.com/matlabcentral/answers/13205#answer_18099

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Image Analyst
Image Analyst am 5 Dez. 2016
Bearbeitet: Image Analyst am 5 Dez. 2016

0 Stimmen

Since total is random numbers, it will never equal exactly 1, so see if it exceeds 1 instead
if total >= 1
Of check within a tolerance
if abs(total-1) < someSmallNumber

Weitere Antworten (2)

Roger Stafford
Roger Stafford am 5 Dez. 2016

0 Stimmen

Oops! I've done something wrong and seemingly erased both my answer and Jan Simon's. I don't know how to correct it, but a thousand pardons Jan!

2 Kommentare

Image Analyst
Image Analyst am 5 Dez. 2016
The way to correct it is to use the Lazarus browser plugin. It's save me numerous times! Highly recommended!
Jan
Jan am 6 Dez. 2016
@Roger: Never mind. I have a bunch of answers here in my drawer and simply choose another one. :-)

Melden Sie sich an, um zu kommentieren.

Jan
Jan am 6 Dez. 2016

0 Stimmen

You can either normalize the data:
U = rand(2, 3);
U = bsxfun(@rdivide, U, sum(U, 2));
Or use Roger's smart function FEX: random-vectors-with-fixed-sum

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by