只运行一次for循环Matlab

时间:2016-08-31 10:32:03

标签: matlab for-loop vectorization

   total_Route = zeros(4,4);
   tmp = evalin('base', 't'); % i initialise t in the Workspace with the value 1

   if(tmp==5)
   tmp=1;
   end

    total_Route(tmp,1) = Distance_Traveled_CM;
    total_Route(tmp,2) = Hauptantrieb_Verbrauchte_Energie_CM;
    total_Route(tmp,3) = Nebenaggregate_Verbrauch_Real_CM;
    total_Route(tmp,4) = t;

    Total_Distance_Traveled_CM = sum(total_Route(:,1));
    set(handles.edit3, 'string',Total_Distance_Traveled_CM);

    Total_Hauptantrieb_Verbrauchte_Energie_CM = sum(total_Route(:,2));
    set(handles.edit4, 'string',Total_Hauptantrieb_Verbrauchte_Energie_CM);

    Total_Nebenaggregate_Verbrauch_Real_CM = sum(total_Route(:,3));
    set(handles.edit5, 'string',Total_Nebenaggregate_Verbrauch_Real_CM);

    %% Index
    set(handles.edit15, 'string',tmp);

    assignin('base', 't', tmp + 1);  % with this line i can increment "t" after each pass
    guidata(hObject,handles);

很抱歉,我没有很好地解释我的问题。

@Sardar_Usama我想只运行一次循环,但每次单击我的按钮后t都会递增。

@ Sembei Norimaki end在我的代码末尾,忘了在我的问题中写下来 @Patrik& @Dennis Jaheruddin让我再次解释我的问题

我创建了一个带有4×4元素的矩阵,目标是在我的矩阵元素中的每个模拟之后保存每个变量(Total_Distance_Traveled_CMTotal_Hauptantrieb_Verbrauchte_Energie_CM等...)的结果(见下图。

enter image description here

我想通过按下一个按钮(在我的GUI上)来获得每列的总和。

实施例

第一遍:t = 1 - > Distance_Traveled(1,1)是GUI将点击按钮,即第一列的总和(即900 + 0 + 0 + 0),并将其写入静态测试。

第二遍t = 2 - > Distance_traveled(2,1)为800,GUI将取第一列的总和(即900 + 800 + 0 + 0)并将其写入静态测试,同样的事情应该发生在另一列上。

这应该持续到t = 4,即直到它为每列做同样的事情,然后它应该重置。

我希望,这次我更好地解释了我的问题,并为我糟糕的英语道歉。

我感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

根据你的代码片段,for循环只被调用一次。

然而,for循环的内容运行了四次。 (首先是i = 1然后是1 = 2等等。)

如果您只想运行其中一个选项,解决方案非常简单:

i = 1
yourLoopContent

如果我第一次总是0,并且你总是希望为当前的i运行它,那也很简单:

yourLoopContent
i = i+1;

然而,如果我第一次没有正确设置,事情会变得混乱。这是因为我默认定义为-1的平方根。 因此,我建议你使用像t这样的不同字母。然后你可以这样做:

if ~exists(t)
    t=0;
end
yourLoopContent %Everywhere using t instead of i
t = t+1;

一般情况下,您可能希望避免使用i作为索引来避免复杂的数字问题。

答案 1 :(得分:0)

我不确定我是否正确地提出了您的问题,但在我看来,您所寻找的是累积金额。这可以通过1:t或使用cumsum购买汇总来完成。我不确定你为什么使用循环,但如果这仅用于求和,则cumsum可以替换它。

以下是您的代码中的一些示例:

total_Route = zeros(4,4);
% I commented below what is not part of the question
for t = 1:4
    total_Route(t,:) = [Distance_Traveled_CM,
        Hauptantrieb_Verbrauchte_Energie_CM,
        Nebenaggregate_Verbrauch_Real_CM,
        t]; 

    % the following line compute the comulative sum from the top of each
    % column to every element in it, so cs_total_Route(3,2) is like
    % sum(total_Route(1:3,2)):
    cs_total_Route = cumsum(total_Route);

    Total_Distance_Traveled_CM = cs_total_Route(t,1); % OR sum(total_Route(1:t,1))
%     set(handles.edit3, 'string',Total_Distance_Traveled_CM);

    Total_Hauptantrieb_Verbrauchte_Energie_CM = cs_total_Route(t,2); % OR sum(total_Route(1:t,2))
%     set(handles.edit4, 'string',Total_Hauptantrieb_Verbrauchte_Energie_CM);

    Total_Nebenaggregate_Verbrauch_Real_CM = cs_total_Route(t,3); % OR sum(total_Route(1:t,3))
%     set(handles.edit5, 'string',Total_Nebenaggregate_Verbrauch_Real_CM);

%     set(handles.edit15, 'string',t);
end

以下是cumsum所做的事情的快速查看(total_Route的一些随机数字):

total_Route =
          671       4.6012       1.0662            1
          840       3.6475      0.58918            2
          354       8.6056       2.1313            3
          893       4.1362       2.0118            4
cs_total_Route =
          671       4.6012       1.0662            1
         1511       8.2487       1.6554            3
         1865       16.854       3.7867            6
         2758       20.991       5.7985           10

这是你要找的吗?