How can simply divide a linear array into 32 equal parts?

I want to divide a linear array of consequtives 0's and 1's into 32 equal parts. Then I want to store number of occurrence of 1's of each parts and size of each parts. I am working with 1000 number of images. For each image I am getting 8 different length linear array.

5 Comments

What is size of your linear array? It should be multiple of 32..is it?
no. its varying in length. not necessarily to be multiple of 32. is it posdibke to divide ?
You can reshape...if it is exactly divisble by 32...else you have to either add or trim extra values.
if the number of elements in the array is not a multiple of 32 then you cannot get 32 equal parts. You need to define what you want to do in this case.
You also need to define what you want if the number of elements is divisible by 32 but the rows and columns are not. For example 240 x 240 does not have rows or columns divisible by 32 but can be divided into 32 by taking either pairs of rows or pairs of columns .
I am always getting 1D arrays of different lengths like 1×31, 1×62, 1×93, 1×124,1×155,1×185,1×216,1+247

Sign in to comment.

Answers (1)

A = rand(1,247) ; % you data
a = length(A) ;
n = 32 ;
b = a + (n - rem(a,n)) ; % Get number divisible by 32
B = zeros(1,b) ;
B(1:a) = A ; % This pad extra zeros
iwant = reshape(B,b/n,[]) ;

11 Comments

This is only possible when you the size already. here I dont know the size before execution
If you have data in hand...it is like you know the size.
No. for 1000 images I am getting different length arrays. now its becoming difficult for me to predict.
what it would be if A is a cell array ?
YOu can access cell array susing flower braces. {}
can I add some zeros to cell array to make each vector consistent in length ?
your same code on cell array is not working
YOu should access cell array such that you get a row vector.....
FirstN = @(v, N) v(1:N);
PadN = @(v, N) FirstN( [v(:).', zeros(1,N)], N) .'; %produces columns
projectdir = pwd;
dinfo = dir(fullfile(projectdir, '*.txt'));
filenames = fullfile(projectdir, {dinfo.name});
numfiles = length(filenames);
datacell = cell(numfiles,1);
for K = 1 : numfiles
thisdata = load(filenames{K});
datacell{K} = thisdata;
end
maxlen = max( cellfun(@length, datacell) );
maxlen = 32 * ceil(maxlen/32); %round up to next multiple of 32
datacell = cellfun(@(v) PadN(v, maxlen), datacell, 'uniform', 0);
splitcells = cellfun(@(v) mat2cell(v, 1, 32 * ones(1,maxlen/32)), datacell, 'uniform', 0);
Now splitcells will be a cell array with one element for each file. Each element will be a cell arrays of 32 vectors. The size of the vectors will be the same for all of the files.
Note that some of the vectors could end up being all zero, if one of the files was more than 33/32 times longer than another.
What is v and N here ? I am not getting first two lines
they are dummy parameter for anonymous functions that make the code easier
The anonymous function
FirstN = @(v, N) v(1:N);
is nearly equivalent to having created a function
function result = FirstN(v, N)
result = v(1:N);
end
That is, take an array as input in the first argument, and take a length in the second argument, and return the first that-many elements of the array.
You can pad an array to a consistent size, say N, by taking an array, appending N zeros to it (so now it is always at least N entries long), and then taking the first N values of the result.

Sign in to comment.

Categories

Find more on Read, Write, and Modify Image in Help Center and File Exchange

Asked:

on 6 Mar 2019

Commented:

on 7 Mar 2019

Community Treasure Hunt

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

Start Hunting!