Reputation: 1215
I have an array in MATLAB
For example
a = 1:100;
I want to select the first 4 element in every successive 10 elements.
In this example I want to b
will be
b = [1,2,3,4,11,12,13,14, ...]
can I do it without for
loop?
I read in the internet that i can select the element for each step:
b = a(1:10:end);
but this is not working for me.
Can you help me?
Upvotes: 1
Views: 187
Reputation: 3898
With reshape
%// reshaping your matrix to nx10 so that it has successive 10 elements in each row
temp = reshape(a,10,[]).'; %//'
%// taking first 4 columns and reshaping them back to a row vector
b = reshape(temp(:,1:4).',1,[]); %//'
Sample Run for smaller size (although this works for your actual dimensions)
a = 1:20;
>> b
b =
1 2 3 4 11 12 13 14
Upvotes: 1
Reputation: 721
To vectorize the operation you must generate the indices you wish to extract:
a = 1:100;
b = a(reshape(bsxfun(@plus,(1:4)',0:10:length(a)-1),[],1));
Let's break down how this works. First, the bsxfun
function. This performs a function, here it is addition (@plus
) on each element of a vector. Since you want elements 1:4 we make this one dimension and the other dimension increases by tens. this will lead a Nx4 matrix where N is the number of groups of 4 we wish to extract.
The reshape
function simply vectorizes this matrix so that we can use it to index the vector a
. To better understand this line, try taking a look at the output of each function.
Sample Output:
>> b = a(reshape(bsxfun(@plus,(1:4)',0:10:length(a)-1),[],1))
b =
Columns 1 through 19
1 2 3 4 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43
Columns 20 through 38
44 51 52 53 54 61 62 63 64 71 72 73 74 81 82 83 84 91 92
Columns 39 through 40
93 94
Upvotes: 0