how to write this for cycle
1 view (last 30 days)
Show older comments
Hi everyone, i need to create this for cycle:
x(64) = 0:1/64:1;
x(128) = 0:1/128:1;
.
.
.
x(4096) = 0:1/4096:1;
0 Comments
Answers (6)
Star Strider
on 10 Nov 2016
I’m not certain what you want. It is straightforward to define an anonymous function to do that:
x = @(n) 0 : 1/n : 1;
and to call it, for example:
xv64 = x(64);
and so for the others.
4 Comments
Star Strider
on 10 Nov 2016
You can have a constant step, or a constant length, but not both.
The best you could do is to store them in a cell array, or create a matrix of NaN values equal to the length of the longest vector, and then fill the matrix rows with shorter vectors.
For example:
x = @(n) 0 : 1/n : 1;
M = nan(7, length(x(2^12)));
for k1 = 1:size(M,1)
v = x(2^(k1+5));
lv = length(v);
M(k1,1:lv) = v;
end
This is likely the most efficient way to create a matrix.
What do you want to do?
Guillaume
on 10 Nov 2016
As I pointed out
"every matrix contains n (=2^i) values which vary from 0 to 1, with a step of 1/(2^i)"
is not possible. You either have n+1 values with a step of 1/n, or you have n values with a step of 1/(n-1), or the values go from 0 to 1-1/n to get n values with 1/n step.
Guillaume
on 10 Nov 2016
arrayfun(@(n) linspace(0, 1, n), 2.^(6:12), 'UniformOutput', false)
will create 7 (not 6!) matrices with the exponent varying from 6 to 12, stored in a cell array
Note that each matrix will have n elements and therefore the step will be 1/(n-1) not 1/n (as it's not possible to generate n elements from 0 to 1 included with a step of 1/n)
1 Comment
Guillaume
on 10 Nov 2016
If you're really insistent you want a step of 1/n, then:
x = arrayfun(@(n) linspace(0, 1, n+1), 2.^(6:12), 'UniformOutput', false); %n+1 elements will create a step of 1/n
If you're really insistent that you want the 7 matrices at indices 64,128, 256, ..., therefore wasting plenty of memory:
x(2.^(6:12)) = arrayfun(@(n) linspace(0, 1, n), 2.^(6:12), 'UniformOutput', false); %or n+1 in linspace
salvatore liberto
on 10 Nov 2016
1 Comment
Guillaume
on 10 Nov 2016
Edited: Guillaume
on 10 Nov 2016
The arrayfun function I used in my answer is exactly equivalent to a for loop, it just requires less typing and is in my opinion easier to read.
If you're really insistent you want a step of 1/n per matrix (and therefore n+1 numbers), then replace the n in the linspace call by n+1.
As also pointed out your 6 matrices are actually seven matrices.
Thorsten
on 10 Nov 2016
Edited: Thorsten
on 10 Nov 2016
You have to use a cell array because your indices have different sizes
e = 6:12;
for i = 1:numel(e), x{2^e(i)} = 0:1/2^e(i):1; end
if you do not need to address x{64}, x{128}, ... but if you can also use x{1}, x{2}, ... you can save some memory by using
for i = 1:numel(e), x{i} = 0:1/2^e(i):1; end
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!