Using for-loop to extract data from every column in a matrix

Hi,
I'm new to using for-loops - can anyone help with my problem.
I have a matrix, 18000X31. I want to be able to write a for loop that for each column, a new variable is created that includes the data from the rows 3000-13600. Any help would be gratefully appreciated.
Thanks in advance!

5 Comments

"I have a matrix, 18000X31."
So you have a matrix, the basic data format for easily storing and efficiently processing data within MATLAB (in fact even the name comes from "MATrix LABoratory", giving a big hint that using matrices is probably a very good idea).
"I want to be able to write a for loop that for each column, a new variable is created that includes the data from the rows 3000-13600."
So you want to replace your simple matrix (which is trivial and efficient to access using indexing) with a whole bunch of dynamically created variables, thus making accessing your data slow, complex, inefficient, obfuscated, and difficult to debug.
Why would you want to do that?
"Any help would be gratefully appreciated."
Explain what you are actually trying to achieve (not how you think you might achieve it).
Hi Stephen,
My question was in relation to a larger project that I'm working on and I thought using a for-loop would help to allow me to step-by-step work through my problem.
I'm trying to achieve isolating the data in the rows 3000-13600 for all of the 31 columns so that I can then take the mean average of every 100 readings in the newly created matrix so that I eventully produce a 106X31 matrix.
I obvioulsy thought breaking it down into steps using a for-loop would be the best way to achieve that, but I'm happy to learn more about what the best practise would be.
Thanks, Ed.
mean100 = reshape(mean(reshape(M(3000:13599, :), 100, [], size(M,2)), 1), [], size(M,2));
Watch out for that endpoint !
@Walter Roberson Fantastic! Thanks for your help, this works perfectly!
"I thought using a for-loop would help to allow me to step-by-step work through my problem."
There is no problem with using a FOR loop. Or reshaping, as Walter Roberson showed you.
But you should avoid creating "new variables" as you described in your question.

Sign in to comment.

Answers (2)

M = randi([0 9], 180, 31); %example
letters = ['A':'Z' 'a' : 'z'];
numletters = length(letters);
for col = 1 : size(M, 2)
randname = letters( randi(numletters, 1, 32) );
tosave.(randname) = M(:,col);
end
tname = tempname() + ".mat";
save(tname, '-struct', 'tosave');
load(tname)
whos
Name Size Bytes Class Attributes BBvQHvyAMsruyGmPBCAtGFwBICGcDREY 180x1 1440 double FBWVzSBqpSgEroLkseFBwLDtWWXsxlxD 180x1 1440 double HkpsAkMtzUJwGFquzeVpqhJCkyMnwQIJ 180x1 1440 double HwsuyfFDnyaOprLHwveGAvIAPaahStOH 180x1 1440 double JpXqzfTZKfscSQxjQpzcyAXkGFrdNDaY 180x1 1440 double KwPHJsOOHqmeABtRqJNRPuIoWXKmptiq 180x1 1440 double KyHyAlLpoEqjClqVDHQSfSSChHZRxIQz 180x1 1440 double LuwGMmEbgbVnTxKWysgVqWQUBSAUOqNU 180x1 1440 double M 180x31 44640 double PSlMFIADpFbonEerutSludFKtrdVvpkd 180x1 1440 double RwdXMqsNjgGaWvbTWCkAXgcSUxHaxqiz 180x1 1440 double TcYHMTGMNhqxILMMhOcCxpJLfgcQbxJn 180x1 1440 double WYetiFJgfEdvjNNcCWMMjtSyxWXsBnCn 180x1 1440 double WcIWJBEpPcFTAtrQDARnBpINiiOzsLOO 180x1 1440 double YeOazlBpsMqHbPwnFUZpDFJEWqyGpuJi 180x1 1440 double YgdZRTlEDdUWbOfquxxuYplYuXjddeKX 180x1 1440 double ZmrbXkYCgqFjfNDsbNviFeyUPjKTgapb 180x1 1440 double aWsXNSxgZZheMVhkGZzcmtvqTJXBlaUv 180x1 1440 double abPmUvvAaIQHsRIYxmNhdeNWRjWimFLe 180x1 1440 double aiZCTrGsddtyrlpMiLJCMHVPxDQLyfex 180x1 1440 double asBxWZIEHuIPHhTSTepsOeRqpIjoOdcI 180x1 1440 double cmdout 1x33 66 char col 1x1 8 double jPXOPvgNgBpTvPeIdtZdzMzpYTDARNkb 180x1 1440 double kHVdaqCsycDjQeAhzsrxzpUwbyFWWsnc 180x1 1440 double lZsnQggmqCwhgprroPTIEXNYZDsljuKo 180x1 1440 double letters 1x52 104 char lxCLtgkKcHWuxyvObWQOvoesroyYGegT 180x1 1440 double numletters 1x1 8 double ooOGyGzeKmhUMXXGYDjehlkqaWsIaIzc 180x1 1440 double qujcfWwyEHTAhwEspdcUqxPxVjiFBYhb 180x1 1440 double randname 1x32 64 char sReqMWIVCMwWweFeFOJCcijOdpnHeNHi 180x1 1440 double tname 1x1 308 string tosave 1x1 49848 struct vIljIfxErWOCoshTfilYvCWfCDtGestN 180x1 1440 double vpvYyvIjGYuBFtMTrAiywIlmjtUMQrNq 180x1 1440 double wFiDXZhNtaSNBGFScNPHNCbgKrZkmrTf 180x1 1440 double xmPutkbkEHAkWqvJqyZljSFohnXBrQyn 180x1 1440 double
Now what? What are you going to do with sReqMWIVCMwWweFeFOJCcijOdpnHeNHi now that you have it?
@Edward Keavney, do this for your matrix m:
[rows, columns] = size(m)
for col = 1 : columns
fprintf('Processing column %d of %d.\n', col, columns);
% Create a new variable with only this particular column,
% but only with rows 3000 to 13600:
thisColumn = m(3000 : 13600, col);
% Now process this column somehow,
% like getting its mean or whatever you want to do.
end
fprintf('All done!\n');

Categories

Products

Release

R2019a

Asked:

on 30 May 2022

Answered:

on 30 May 2022

Community Treasure Hunt

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

Start Hunting!