【问题标题】:Extract parts of a big matrix and allocate them in new variables with loop function提取大矩阵的一部分并使用循环函数将它们分配到新变量中
【发布时间】:2012-12-30 21:29:23
【问题描述】:

我是 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 的数据)而不浪费大量时间和空间(wto 重新复制核心部分代码一次又一次)用于脚本,并使用循环函数?!换句话说,我想检测 - 使用循环函数和分组变量 - 哪些值是感兴趣的,然后绘制它们(例如,第 3 列中的数据以及每个人的第 4 列中的数据,从第一个到最后一个)?!

我希望我清楚地描述了我的问题,并希望听到专家们的意见:) ...

非常感谢..

【问题讨论】:

    标签: matlab loops matrix extract


    【解决方案1】:

    试试下面的代码:

    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”表示要提取的行,并且由于我想要所有列,所以我只使用“:”(你也可以使用“1: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
    

    【讨论】:

    • 哦......非常感谢......对于明确的答案,但也非常快速的回复......我会尝试它(我在第一次复制时得到红色:p ) 然后我会更新我的答案,,,
    • 更新 .... 我收到此错误消息:使用 horzcat 时出错 连接的矩阵的维度不一致。 Test_Script 中的错误(第 6 行) eval(['Indi_' num2str(idx) '=ALL_Indi_Data(' num2str(pos) ',1:21);']);有什么线索>>?我必须提到,对于一个人来说,可能有 6 或 7 个信息源 .. 等等 .. !!再次提前感谢
    • 这可能是因为它在不止一行中找到 ID。如果您想要第一个匹配的行,您应该将 num2str(pos) 更改为 num2str(pos(1))。如果你想要它们...你想如何保存它们?使用哪个变量名?
    • 啊哈..谢谢..但是如果我想将所有 6 行放在一起怎么办?这样新矩阵将是 21 列 x 6 行 ...作为由 21 列 x 600 行组成的大矩阵的一部分 ...我希望将它们保存为一个新的较小矩阵,名称为 Indi_1、Indi_2 等. ... :)
    • 我已经编辑了我的答案,试图让它像你说的那样工作。希望它现在对你有用。告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多