【问题标题】:For-loop exits too early, need help as to whyFor-loop 退出太早,需要帮助了解原因
【发布时间】:2015-11-23 13:42:01
【问题描述】:

我写了一个简单的函数,它接受一个向量 vec,遍历它,执行一个操作,其结果存储在另一个相同大小的向量 vecRes 中索引,并在完成循环后返回 vecRes。下面是功能代码:

function [ vecRes ] = squareTerms( vec )
    vecSize = size(vec);
    vecRes = zeros(vecSize);
    for i = 1:vecSize
        vecRes(i) = vec(i)^2;
    end
end

问题是它似乎退出得太早了,实际上只经过一次迭代后,输出显示为:

vecRes = 1     0     0     0     0     0     0     0     0     0

输入:

vec = 1     2     3     4     5     6     7     8     9    10

我不知道为什么会这样。非常感谢任何帮助。

【问题讨论】:

  • 使用the debugger 并阅读您正在使用的函数的文档。特别是size的输出
  • vecSize的内容是什么?我敢打赌这不是你所期望的。
  • 而你所追求的只是vecRes = vec.^2,不需要循环。
  • 在这种情况下使用 numel 而不是 size
  • 是的,问题就是这样,因为它是一个单行矩阵,它几乎会将它视为一个数组。哦,好吧,接受了本的回答,因为它提供的信息最多,尽管用户someNo 的另一个回答同样正确,而且正是我现在写的。感谢有关元素操作的提示,而不是 for 循环顺便说一句,没想到。我的循环浪费空间是^^

标签: matlab function for-loop


【解决方案1】:

Size 返回 2 个值,行和列。可能你有一个 1xN 向量。所以 size 返回 [1 N] 并且你的循环运行 1 次。

>>> size ([1 2 3])
> 
> ans =
> 
>      1     3
> 
>>> 1:size ([1 2 3])
> 
> ans =
> 
>      1

【讨论】:

    【解决方案2】:

    其他人已经指出了问题所在。在这种情况下,我首选的解决方案是使用numel,即

    vecRes = zeros(size(vec));
    for i = 1:numel(vec)
       vecRes(i) = vec(i) ^ 2;
    end
    

    当然,在这种情况下,矢量化更好:

    vecRes = vec .^ 2;
    

    【讨论】:

      【解决方案3】:

      替换

      for i = 1:vecSize
      

      for i = 1:vecSize(2)
      

      【讨论】:

        【解决方案4】:

        vecSize 是一个数字数组,而不仅仅是一个值。例如,如果 vec 是 1 x 8 向量,则 size(vec) 将返回 [1, 8]。

        因此,您的 for 循环语句,

        for i = 1:vecSize
        

        ,实际上相当于:

        for i = 1:[1, 8]
        

        这没有多大意义。有很多方法可以解决这个问题。你可以写:

        for i = 1:length(vec)
        

        for i = 1:numel(vec) % "numel" stands for "number of elements"
        

        如果向量是1xn而不是nx1,可以写成:

        for i = 1:size(vec, 2)
        

        另一种选择是:

        for i = 1:max(vecSize)
        

        不过,最明智的选择是根本不写 squareTerms 函数,直接写

        vecRes = vec.^2;
        

        注意插入符号前的点。 vec^2 和 vec . ^2 不是一回事。

        如果在操作符符号前加一个点,则操作将按元素执行。例如,

        C = A * B
        

        执行矩阵乘法,但是

        C = A .* B
        

        将 A 的第一个元素乘以 B 的第一个元素,并将结果分配给 C 的第一个元素。然后,将取 A 和 B 的第二个元素的乘积,并且结果会卡在C的第二个元素中,以此类推。

        vecRes = vec.^2;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-19
          • 2016-05-03
          相关资源
          最近更新 更多