【问题标题】:Run the for loop only once Matlab只运行一次 for 循环 Matlab
【发布时间】:2023-03-24 16:17:01
【问题描述】:
   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 等)的结果(见下图) .

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

示例

第一遍:t = 1-->Distance_Traveled(1,1)是900,GUI会通过点击Button,第一列的总和(即900+0+0+0)写在一个静态测试。

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

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

我希望这次我能更好地解释我的问题,并为我的英语不好表示歉意。

感谢您的帮助。

【问题讨论】:

  • 如果您只想运行循环一次,那么使用循环的目的是什么? “i”应该在每次通过后递增是什么意思?
  • for 循环在哪里结束?在 Matlab 中,您需要和 end 进行循环。
  • 抱歉,我不知道你想做什么。你需要给我们更多的东西。
  • @EBH 请注意,“直到”中只有一个 l。
  • @AndrasDeak 好吧,他们是so many,我无法全部抓到;)

标签: matlab for-loop vectorization


【解决方案1】:

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

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

如果您只想运行这些选项之一,解决方案非常简单:

i = 1
yourLoopContent

如果 i 第一次总是为 0,而你总是想为当前 i 运行它,那也很简单:

yourLoopContent
i = i+1;

但是,如果我第一次没有正确设置,事情就会变得一团糟。这是因为 i 默认定义为负 1 的平方根。 因此,我建议您使用不同的字母,例如 t。然后你可以这样做:

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

一般而言,您可能希望避免将 i 作为索引以避免复数问题。

【讨论】:

  • 抱歉,我没有很好地解释我的问题。 @Sardar_Usama 我只想运行一次循环,但每次模拟后“i”应该只增加一次
  • @Sami 你看过我回答中的三个建议了吗?根据您的评论,我会说第二个或第三个应该是您正在寻找的。​​span>
  • @Dennis Jaheruddin 感谢丹尼斯的快速回复。我试图更好地描述我的问题,希望现在可以理解了。
【解决方案2】:

我不确定我是否正确地回答了您的问题,但在我看来,您要查找的是累积总和。这可以通过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

这是你要找的吗?

【讨论】:

  • 您已经用随机数填充了表格,在我的情况下,当 (t=0) 表格为空时。我在工作区中获得我的变量(Total_Distance_Traveled_CM,Total_Hauptantrieb_Verbrauchte_Energie_CM)的每个模拟值之后,我想将这些值保存在每列的第一个单元格中,并计算每列单元格的总和。 PS:其他单元格仍然是空的,它们将在下一次传递“t”时填充值。重要的是记住最后一次传递的最后一个值,并在每次单元格填充值后返回总和。你明白我的意思了吗?
  • 我希望通过按下按钮来增加“t”。 (每次按下按钮时将“t”加一,直到 t = 4 并且应再次将其重置为 1 )这意味着当 t=1 时,我的变量的值将填充到我的每个列的第一个单元格中.当 t = 2 时,我的变量的值将填充到我的每个列的第二个单元格中。等到 t = 4,我希望每次通过都得到我的列的总和。
  • 随机变量仅用于示例。请参阅我对您的案例的编辑。
  • 在这种情况下,单击我的按钮一次,fo​​r 循环将运行 4 次
  • 您的目标对我来说不是很清楚,但也许您不需要循环,只需在开始时定义t = 1,每次单击按钮后将t 增加1 . 我建议在一个函数中扭曲所有这些,当按下按钮时调用它,比如:total_Route = get_values(total_Route,Distance_Traveled_CM, Hauptantrieb_Verbrauchte_Energie_CM, Nebenaggregate_Verbrauch_Real_CM, t)。所以ttotal_Route 一起被传递给函数,而total_Route 被返回并填充了另一行。这听起来更接近预期的行为?
最近更新 更多