26 views (last 30 days)

May_the_degrees_of_freedom_be_with_you
on 23 Jan 2020 at 3:53

Commented: Walter Roberson
on 23 Jan 2020 at 4:32

Goal:

- Have for loop repeatedly create matrices of random integers
- Create new matrix where columns = variance for each row of random integer matrices
- Compare variance to increment ranging from 0:0.01:4 (0-4 in increments of 0.01) and retain each matrix of 0s and 1s generated this way

The following code produces the desired results when the increment = 1 (not 0.01)

T = 10;

W = zeros(3,10);

for trial = 1:T

mtest = randi([1,5],3,4)

W(:,trial) = var(mtest,0,2);

end

minc = zeros(3,10,5);

for mindex = 0:1:4

minc(:,:,mindex+1) = W >= mindex

end

Problem 1: The same code does not work when the increment is set to 0.01:

linc = zeros(3,10,401);

for lindex = 0:0.01:4

linc(:,:,lindex+1) = W >= lindex

end

Error = Index in position 3 is invalid. Array indices must be positive integers or logical values.

Problem 2: After much reading, I think the problem is that "lindex+1" produces indices of 1.01, 1.02...etc. Yet both of the below solutions produce the same error.

Solution 1: Add 1 to remove 0 from index; multiply by 100 such that index should proceed as 100, 101, 102...etc.

linc = zeros(3,10,401);

for lindex = 0:0.01:4

linc(:,:,(lindex+1)*100) = W >= lindex

end

Solution 2: Start index at 0.01 instead of 0 and multiply by 100 such that index should proceed as 100, 101, 102...etc.

linc = zeros(3,10,401);

for lindex = 0.01:0.01:4

linc(:,:,lindex*100) = W >= lindex

end

Why does the code work if increment = 1 but not 0.01? How can I fix this? Thank you in advance, this is a wonderful community.

KSSV
on 23 Jan 2020 at 4:01

Edited: KSSV
on 23 Jan 2020 at 4:02

lindex = 0:0.01:4 ;

linc = zeros(3,10,401);

for i = 1:length(lindex)

linc(:,:,i) = W >= lindex(i) ;

end

Please note that, your indices should not be zero, or fractions or negative. In your original code in problem 1, you have used fractions, zero as indices, therefore you gor errors.

KSSV
on 23 Jan 2020 at 4:22

Walter Roberson
on 23 Jan 2020 at 4:32

If you take values constructed with the : operator with increment 0.01 and you multiply the values by 100, then roughly 1/10th of the results will not be integers.

MATLAB does not represent numbers in decimal: it represents them in binary. In binary, 1/100 requires an infinite repeating number to represent exactly, for precisely the same reason that in decimal, 1/7 needs an infinite repeating number to exactly represent. Therefore any finite binary truncation of a multiple of 1/100 will not exactly represent the fraction, and when you multiply the inexact representation by 100 you will not always get out an integer.

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 3 Comments

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/501555-for-loop-with-decimal-increment-not-seen-as-integer-or-logical-value#comment_789024

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/501555-for-loop-with-decimal-increment-not-seen-as-integer-or-logical-value#comment_789024

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/501555-for-loop-with-decimal-increment-not-seen-as-integer-or-logical-value#comment_789029

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/501555-for-loop-with-decimal-increment-not-seen-as-integer-or-logical-value#comment_789029

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/501555-for-loop-with-decimal-increment-not-seen-as-integer-or-logical-value#comment_789032

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/501555-for-loop-with-decimal-increment-not-seen-as-integer-or-logical-value#comment_789032

Sign in to comment.