我是MATLAB的初学者,我希望在这里找到一些帮助。我在一个大矩阵中共有80个人的模型预测结果。我需要从大矩阵中提取每个人的数据,将它们分配给一个新的变量/矩阵,做一些额外的计算,然后根据需要绘制某些信息。
为此,我试图编写一个带循环函数的脚本,但是复杂,或者更准确:用一种原始方式!
简化示例: 我的矩阵被称为:All_Indi_Data ....它的维度是:600行x 21列
%Column 1: grouping variable (e.g., code or ID with values 1,2,3,4,5, etc.);
%Column 2: independent var.;
%Column 3: t;
%Column 4: OBS;
%Column 5: PRED;
i= length (All_Indi_Data);
%% First Indi.
q=1; % indicating the ID of the indi for which I want to extract the data
j=1; % variable added to insure writing start from the first row
for r=1:i
if All_Indi_Data (r,1)==q
Indi_1 (j,1:21) = All_Indi_Data (r,1:21)
j=j+1
end
end
%% Second Indi.
q=q+1
j=1
for r=1:i
if All_Indi_Data (r,1)==q
Indi_2 (j,1:21) = All_Indi_Data (r,1:21)
j=j+1
end
end
.
.
.
1)我的第一个问题是:我是否可以使用或不使用循环函数以更简单的方式在新变量(Indi_1,Indi_2等)中分配这些数据?!!!非常感谢你的帮助。
2)是否有任何代码或任何方式从前面提到的大矩阵中绘制这些选定的部分(根据分组变量,例如Indi_1的数据)而不浪费大量的时间和空间(重新复制核心部分一遍又一遍的代码)脚本,并使用循环函数?!换句话说,我想检测 - 带循环功能&分组变量 - 哪些值是感兴趣的,然后绘制它们(例如,第一列中的数据和第4列中每个人的数据,从第一个到最后一个)?!
我希望我能清楚地描述我的问题并希望听到专家们的意见:) ...
提前多多感谢..
答案 0 :(得分:3)
请尝试以下代码:
for idx=1:80
pos=find(All_Indi_Data(:,1)==idx);
eval(['Indi_' num2str(idx) '=All_Indi_Data(pos,:);']);
end
我所做的是:在每次迭代中,我搜索ID的值,在变量idx中指示。请注意,我不使用'i'作为变量的名称,因为Matlab使用它和'j'以及虚数单元用于复数,这可能会导致问题。
然后,使用find我搜索All_Indi_Data的位置(或位置),我可以在其中找到该个人的信息。现在我在变量'pos'中有行的索引,其中有感兴趣的个人的信息。
最后,使用eval我将每个人的数据提取到一个变量中。请注意,eval与循环结合使得创建大量变量变得容易。我用'pos'指出要提取的行,并且因为我想要所有列,我只使用':'(你也可以使用':21')。
使用另一个类似的循环,您可以绘制所需的信息。例如:
for idx=1:80
eval(['x=Indi_' num2str(idx) ';']);
% Now I have in X the information for this individual
%Plot the columns of x I want
plot(x(:, 3), x(:,4));
pause; %stay here until a press a key
end