create multiple submatrices from larger matrix

I have a 5000 x 3 matrix. The first column denotes temperature, and 100 data points were taken at each temperature. I want to pull out a separate 100 x 3 matrix at each temperature point. The temperature at each point is in a slightly variable range (for instance, for the first matrix at 9K, the temperature varies between 8.99 and 9.01 K). I think I need to use arrayfun but I'm not sure how to go about it. Below is what I think is a related question.
https://www.mathworks.com/matlabcentral/answers/359557-how-can-i-make-smaller-matrices-size-unknown-from-a-large-matrix

Antworten (3)

Mark Sherstan
Mark Sherstan am 30 Nov. 2018

0 Stimmen

Does this work for you?
x = rand(5000,3);
count = 1;
for ii = 1:100:length(x)-100
y{count} = x(ii:ii+100,:);
count = count+1;
end
You can then extract the matrices as so:
y{1}
Which would give you 1:101 or your 100 temperature points and their corresponding values.
You will be missing some data on your last one as MATLAB starts its index at 1 and not 0.

4 Kommentare

Thanks for the answer! This doesn't seem to be what I'm looking for however. The matrices extracted are only 2 columns and the values in the matrices aren't the same as the ones in the original matrix.
Where I'm at right now: if I put the following in, I get a 100 x 3 submatrix which contains only points taken at approx 9 K. I would like to generalize this so that it will loop and pull out 100 x 3 submatrices at the 50 different temperatures.
result=arrayfun(@(x)AAA(AAA(:,1)<9.1,:),1:1,'uni',false);
Image Analyst
Image Analyst am 30 Nov. 2018
Huh? No data should be missing.
Ryan Murphy
Ryan Murphy am 30 Nov. 2018
Actually this worked! thanks a bunch! apologies for my confusion
Image Analyst
Image Analyst am 30 Nov. 2018
Not sure why you say that works at giving you 50 arrays of 100 rows each. What we see is:
>> y
y =
1×49 cell array
Columns 1 through 7
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
Columns 8 through 14
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
Columns 15 through 21
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
Columns 22 through 28
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
Columns 29 through 35
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
Columns 36 through 42
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
Columns 43 through 49
{101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double} {101×3 double}
You can see that you are getting 49 cells of 101 elements each. Did you see my answer where you get 50 arrays of 100 each - exactly what you requested?

Melden Sie sich an, um zu kommentieren.

Image Analyst
Image Analyst am 30 Nov. 2018

0 Stimmen

Try this:
data = rand(5000,3);
for row = 1 : 100 : size(data, 1)-99
% Pull out a 100 row block of data.
fprintf('Extracting rows %d to %d.\n', row, row+99);
y100 = data(row:row+99, :);
% Now do something with y100.
end
You'll see
Extracting rows 1 to 100.
Extracting rows 101 to 200.
Extracting rows 201 to 300.
Extracting rows 301 to 400.
etc.
Extracting rows 4701 to 4800.
Extracting rows 4801 to 4900.
Extracting rows 4901 to 5000.
Stephen23
Stephen23 am 1 Dez. 2018
Bearbeitet: Stephen23 am 1 Dez. 2018

0 Stimmen

M = rand(5000,3); % fake data
C = mat2cell(M,50*ones(100,1),3);
for k = 1:50
C{k}
end

Kategorien

Gefragt:

am 30 Nov. 2018

Bearbeitet:

am 1 Dez. 2018

Community Treasure Hunt

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

Start Hunting!

Translated by