简体   繁体   中英

Retrieving specific elements in matlab from arrays in MATLAB

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?

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM