在工作空间中保存循环数据(Matlab)

在工作空间中保存循环数据(Matlab),matlab,for-loop,nan,parfor,Matlab,For Loop,Nan,Parfor,晚上好,, 请帮我写一个剧本好吗?我有一个嵌套在for循环中的parfor循环。目标是迭代一组数据,这些数据由早期parsim simulink分析生成的10个数据子集组成(标记为1x10 SimulationOutput)。每个数据子集有24行深,列的长度可变(通常为200000到300000列数据)。这个过程的一部分是找出每个数据集中的最大值或最小值。完成后,将其放入一个表中,并将数据附加到该表中。理想情况下,我应该有一个6x10表结束它。请参见下面的代码: % Run Time tic

晚上好,, 请帮我写一个剧本好吗?我有一个嵌套在for循环中的parfor循环。目标是迭代一组数据,这些数据由早期parsim simulink分析生成的10个数据子集组成(标记为1x10 SimulationOutput)。每个数据子集有24行深,列的长度可变(通常为200000到300000列数据)。这个过程的一部分是找出每个数据集中的最大值或最小值。完成后,将其放入一个表中,并将数据附加到该表中。理想情况下,我应该有一个6x10表结束它。请参见下面的代码:

% Run Time
tic

% Preallocate memory to increase speed

b=zeros(24,1); %Make space for this array.
c=zeros(500000,1);
d=zeros(500000,1);
e=zeros(500000,1);
f=zeros(500000,1);
g=zeros(500000,1);
h=zeros(500000,1);
%table=[];

for j = 1:length(out(1,:)) %iterate over each run

    parfor i = 1:length(out(1,j).PN.time) % Set length of vector
        b=out(1,j).PN.signals.values(:,i); % Find the values to work on
        c(i)=b(19,:); % Distance to target (m)
        d(i)=b(20,:); % Lat. Accelerations, integrated twice (m)
        e(i)=b(21,:); % Long. Acceleration, integrated twice (m)
        f(i)=b(22,:); % Lat. Guidance Error
        g(i)=b(23,:); % Long. Guidance Error
        h(i)=b(24,:); % time to target (sec)
   
    end
   
    %For c_min, there's extranous zeros popping up, exclude them
    tc = c;
    tc(tc <= 0) = nan;
    [c_min, I_1] = min(tc);
    %    [c_min,I_1]=min(c(c>0)); % Collect the closest missile/target approach (most 
    critical value)
    
    [d_max,I_2]=max(d); % We need to find the max value per run, but wish for the min value 
    %over all runs.
    
    [e_max,I_3]=max(e); % We need to find the max value per run, but wish for the min value 
    %over all runs.
    
    [f_min,I_4]=min(f); % We just want the minimum value here.
    
    [g_min,I_5]=min(g); % We just want the minimum value here.

    [h_max,I_6]=max(h); % The minimum time is 2nd most critical value, after distance to 
    %target.

    table(:,j)=[ c_min d_max e_max f_min g_min h_max]; %d_max e_max f_min g_min h_max

end

toc
%运行时
抽搐
%预先分配内存以提高速度
b=零(24,1);%为这个数组腾出空间。
c=零(500000,1);
d=零(500000,1);
e=零(500000,1);
f=零(500000,1);
g=零(500000,1);
h=零(500000,1);
%表=[];
对于j=1:length(out(1,:)%在每次运行中迭代
parfori=1:长度(out(1,j).PN.time)%Set向量长度
b=输出(1,j).PN.信号值(:,i);%找到要处理的值
c(i)=b(19,:);%距目标距离(m)
d(i)=b(20,:);%横向加速度,积分两次(m)
e(i)=b(21,:);%长的加速度,积分两次(m)
f(i)=b(22,:);%横向制导误差
g(i)=b(23,:);%长的制导误差
h(i)=b(24,:);%到达目标的时间(秒)
结束
%对于c_min,有多余的零出现,排除它们
tc=c;
tc(tc0));%收集最近的导弹/目标进近(most)
临界值)
[d_max,I_2]=max(d);%我们需要找到每次运行的最大值,但希望得到最小值
%在所有运行中。
[e_max,I_3]=max(e);%我们需要找到每次运行的最大值,但希望得到最小值
%在所有运行中。
[f_min,I_4]=min(f);%我们只需要这里的最小值。
[g_min,I_5]=min(g);%我们只需要这里的最小值。
[h_max,I_6]=max(h);%最短时间是第二个最关键的值,仅次于到的距离
%目标。
表(:,j)=[c_min d_max e_max f_min g_min h_max];%d_max e_max f_min g_min h_max
结束
toc
我遇到的问题是,虽然我可以在表中的正确位置输入正确的数据集,但如果我设置一个常量j值(例如:如果j=7,那么表中的第7列将获得正确的数据),我似乎无法获得正确输入的所有值。我的意思是,输出的表(6x10)将有跨列的重复值,从一列到另一列的值,等等)。这就好像脚本不能再区分列了,所以值只会随波逐流


如果有人有什么建议,我将不胜感激。谢谢,

如果您使用
for
而不是
parfor
,是否有效?不那你就有一只虫子了。对然后MATLAB有一个bug。你真的应该把外循环变成parfor循环,这是最有效的方法。我不熟悉Simulink的输出。当您进行
输出(1,j).PN.signals.values(:,i)
时,是否进行了任何计算?或者您只是从这个循环中的数组中复制数据?不幸的是,没有,我得到的答案与“for”和“parfor”相同。我将使外部循环成为parfor循环,内部循环成为for循环。