Loop through every nth row in a data frame in a function

4 次查看(过去 30 天)
I want to loop through specific rows to pick up data for some program I wrote and wondering if there is an efficient way of doing that. I have my coordinates in a matrix and each row represents a subject and the colums are the different orientation coordinates for a subject (see below)
In my loop I want to go through each row (each row and pick e.g "nose" for for each subject)
%% Define coil position
S.poslist{1}.pos(1).matsimnibs = [-m0n0 m1n0 -m2n0 x; -m0n1 m1n1 -m2n1 y; -m0n2 m1n2 -m2n2 z; 0 0 0 1]
I want to achieve something like this below but selecting every 4th row
S.poslist{1}.pos(1).matsimnibs = [-TargetInfo.data(4) TargetInfo.data(7) -TargetInfo.data(10) TargetInfo.data(1); -TargetInfo.data(5) TargetInfo.data(8) -TargetInfo.data(11) TargetInfo.data(2); -TargetInfo.data(6) TargetInfo.data(9) -TargetInfo.data(12) TargetInfo.data(3); 0 0 0 1]

采纳的回答

Sulaymon Eshkabilov
The simpler and more efficient way would be using a logical indexing option or just use necessary indices, e.g.:
% DATA input/generation as a table array
TS = categorical({'Boy'; 'Boy';'Boy';'Boy'; 'Girl';'Girl';'Girl';'Girl';});
TN = categorical({'A'; 'B'; 'C'; 'D';'A'; 'B'; 'C'; 'D'});
DATA=table(TS);
DATA.TName=TN;
M1 = randn(numel(TN),1);
M2 = randn(numel(TN),1);
M3 = randn(numel(TN),1);
M4 = randn(numel(TN),1);
M5 = randn(numel(TN),1);
M6 = randn(numel(TN),1);
M7 = randn(numel(TN),1);
M8 = randn(numel(TN),1);
M9 = randn(numel(TN),1);
M10 = randn(numel(TN),1);
M11 = randn(numel(TN),1);
M12 = randn(numel(TN),1);
DATA.M1 = M1;
DATA.M2 = M2;
DATA.M3 = M3;
DATA.x = M4;
DATA.M5 = M5;
DATA.M6 = M6;
DATA.M7 = M7;
DATA.y = M8;
DATA.M9 = M9;
DATA.M10 = M10;
DATA.M11 = M11;
DATA.z = M12
DATA = 8×14 table
TS TName M1 M2 M3 x M5 M6 M7 y M9 M10 M11 z ____ _____ __________ _________ ________ ________ ________ ________ ________ _________ ________ ________ ________ ________ Boy A 0.94176 0.96592 0.83127 -0.96469 -1.1138 0.95343 0.29157 -0.2933 0.13869 -1.1075 0.59653 -0.1007 Boy B -0.0085146 1.4973 0.85337 -1.7562 -2.1965 1.9926 -0.10816 1.2715 -0.21628 0.23034 0.75606 0.085673 Boy C -0.13105 -0.19626 0.75003 -0.97582 0.022491 -0.1896 0.80425 -0.17841 0.11202 0.77753 0.32635 -0.64259 Boy D -0.18264 -2.2729 -0.39656 1.9849 0.1503 0.26151 -0.87482 1.0075 0.60166 0.43676 0.64651 0.12189 Girl A 0.56582 -2.5636 -0.88507 -0.95755 -1.2312 0.42936 -0.39495 -1.0043 2.1618 -0.14574 -0.8057 2.0259 Girl B 0.46113 0.4177 0.37114 0.12721 -0.42584 -0.19921 0.94893 1.3251 0.080742 -0.98153 0.052248 0.34372 Girl C -0.78052 -0.029752 -1.2213 -0.91497 -0.18431 0.12213 0.52505 -0.22272 -1.0057 -2.6867 -1.2729 -1.9098 Girl D 1.0694 -1.6838 -0.2042 0.36261 -0.22849 -0.15683 -0.49298 -0.038873 -0.88004 0.76735 0.16935 1.6251
% Logical indexing is used to take only 'A' or in your exercise: 'Nose'
% Note TName is a categorical data
CA=table2array(DATA(DATA.TName=='A', 3:end));
% Take out the necessary data and make some negative and leave some
% unchanged
Nose = [reshape(CA, 6, 4); 0 0 0 1].*[-1 1 -1 1]
Nose = 7×4
-0.9418 -0.9647 -0.2916 -1.1075 -0.5658 -0.9576 0.3949 -0.1457 -0.9659 -1.1138 0.2933 0.5965 2.5636 -1.2312 1.0043 -0.8057 -0.8313 0.9534 -0.1387 -0.1007 0.8851 0.4294 -2.1618 2.0259 0 0 0 1.0000
% Alternative way:
CA2=table2array(DATA(1:4:end, 3:end));
Nose2 = [reshape(CA2, 6, 4); 0 0 0 1].*[-1 1 -1 1]
Nose2 = 7×4
-0.9418 -0.9647 -0.2916 -1.1075 -0.5658 -0.9576 0.3949 -0.1457 -0.9659 -1.1138 0.2933 0.5965 2.5636 -1.2312 1.0043 -0.8057 -0.8313 0.9534 -0.1387 -0.1007 0.8851 0.4294 -2.1618 2.0259 0 0 0 1.0000

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by