resize matrix based on indices
5 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi,
I am working with matrices as in the file attached below. The first 4 columns log for stimuli representation in time. The rows are time and the columns are events. The first column logs stimuli id in time. (No stimulus =0, stimulus : 1 2 3 4 5 or 6) The second column logs the stages (1= pre stimulus, 2=Stimulus, 3= post stimulus ); Column 3 logs duration and ID of each trial. Trial 1 ==1; Trial trial 2 ==2; etc I need to select given trials ids. For example, take trials [2 5 7 10] concatenate them back in to matrix and save as another file. Can anyone help with it?
0 commentaires
Réponse acceptée
Voss
le 3 Nov 2023
input_file = 'logfile_example-30-09-23 .xlsx';
output_file = 'trials_2_5_7_10_only.xlsx';
ids = [2 5 7 10];
id_column = 3;
T = readtable(input_file);
T_new = T(ismember(T.(id_column),ids),:);
writetable(T_new,output_file)
2 commentaires
Stephen23
le 3 Nov 2023
"Is there way to save excel file without headers (var 1, var 2, var 3, ...)?"
Read about WriteVariableNames in the WRITETABLE documentation
Plus de réponses (1)
Constantino Carlos Reyes-Aldasoro
le 3 Nov 2023
This is an example of what is called "addressing a matrix", i.e., you need to use the address of certain locations of a matrix in matlab. I will copy part of your data and adapt to illustrate
data = [ 0 1 1 1 1.991688728 1.103503108 2.441900969 0.566304922 1.489537835 1.773482203 1.95588553 ;...
0 1 1 2 1.783852696 1.137677789 2.268280506 0.54307586 1.646252394 1.575202107 1.591086984 ;...
0 1 1 3 1.958541274 1.029714346 2.508745909 0.563571632 1.846422434 1.870307446 1.568911672 ;...
0 1 1 4 1.994016409 1.224192739 2.379162073 0.378690213 1.639967084 1.7403965 2.070030212 ;...
8 1 1 5 1.925235748 1.208242774 2.574904919 0.450008661 1.614949703 2.012422562 1.788136601 ;...
8 1 1 6 1.940020323 1.030568957 2.674375296 0.292536885 1.561530113 1.818652987 1.704922438 ;...
0 1 1 7 1.63369894 1.03463912 2.50246048 0.289227307 1.552333713 1.539394379 1.914013505 ;...
8 1 1 8 1.975015521 1.269600391 2.304613352 0.469067484 1.385410786 1.596593976 1.827103496 ;...
9 1 1 9 1.736701131 0.980502307 1.776961684 0.474588722 1.531394362 1.590884686 1.521726131 ;...
9 1 1 10 1.74925375 0.972486496 2.514164209 0.501453996 1.752897501 1.724050045 1.440591812 ;...
0 1 1 11 1.835679412 1.267914653 2.304520369 0.302720666 1.587394953 1.592901349 1.91214478 ];
If you know the address (rows and columns) that you need, then it is very easy to retrieve those values, for instance rows 1 and 2, and columns 2 to 4
data(1:2, 2:4)
Or all values of the third row:
data(3,:)
Notice how the addresses are passed as row, column.
When you do not know the exact address, but you know the values that define those addresses, like the first column, you can search for the values and use those as indices, e.g. take first five columns of all rows that have an 8 in the first column:
data( data(:,1)==8, 1:5)
Or take the first 8 columns of those rows that have a value less than 0.3 in the column 8. Now, also save into a new variable:
data2 = data( data(:,8) < 0.3, 1:8)
In that way, you can select any regions of your data and then save them as the new variable.
Hope this helps you solve your problem. If you need a longer description, the first chapter of my book has more details:
https://www.wiley.com/en-us/Biomedical+Image+Analysis+Recipes+in+MATLAB:+For+Life+Scientists+and+Engineers-p-9781118657447
0 commentaires
Voir également
Catégories
En savoir plus sur Whos dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!