【问题标题】:MATLAB loop through an array of vectorsMATLAB 循环遍历向量数组
【发布时间】:2017-01-26 22:03:02
【问题描述】:

我想不出合适的语法来做到这一点。我有 4 个向量,每个向量都有 15 个元素。我想提取一个长度为 4 的向量,其中包含每个原始向量的第一个元素,然后对其进行处理。然后我想对每个向量的第二个元素做同样的事情,等等,并将所有答案存储在矩阵或数组中。像这样的:

for i = 1:15
    new_vec=zeros(4);
    n=1;
        for fc = {vec_A, vec_B, vec_C, vec_D}
            new_vec(n)=fc(i);
            n=n+1;
        end
     Final_answers{i}=functionDoThings(new_vec);
end

但我明白了:

> The following error occurred converting from cell to double: Error
> using double Conversion to double from cell is not possible. Error in
> my_script (line 31)
>             new_vec(n)=fc(i);

我觉得我缺少一种更简单的方法来做到这一点。

【问题讨论】:

  • 将 4 个向量放在一个 4x15 矩阵中(这可能是它们最初应该是的),然后取矩阵的每个 4x1 列。

标签: arrays matlab for-loop vector iteration


【解决方案1】:

您的内部循环正在循环一个 1x4 单元格:

for fc = {vec_A, vec_B, vec_C, vec_D}
    new_vec(n)=fc{1}(i)
    n=n+1;
end

这导致 fc 在每次迭代中都是一个 1x1 单元格。

要访问单元格内的实际数据,您需要使用大括号:

for fc = {vec_A, vec_B, vec_C, vec_D}
    new_vec(n)=fc{1}(i)
    n=n+1;
end

{1} 将访问 fc 的第一个单元格和 (i) 所需的元素。

不过,建议使用像烧杯这样的矩阵更容易、更快捷:

fc = [vec_A; vec_B; vec_C; vec_D];
for i = 1:15
    new_vec = fc(:,i);

    ...
end

【讨论】:

  • 您可能应该将fc 拉出循环。无需生成 15 次相同的数组。
  • 有效点!我只是解开内部循环,没有考虑任何进一步的改进。
  • 谢谢,这正是我所需要的。你的 fc 给了我一个 64x1 矩阵,所以我最终得到: fc = [vec_A, vec_B, vec_C, vec_D];对于 i = 1:15 new_vec = fc(i,:); ...结束
  • fc = [vec_A, vec_B, vec_C, vec_D]; for i = 1:15 new_vec = fc(i,:); ... end
  • 啊,是的,这取决于您的 vec_A、vec_B、vec_C、vec_D 是 1x15 还是 15x1 阵列。在我的示例中,它们将是 1x15。
【解决方案2】:

错误告诉fc(i) 在尝试将其作为double 放入数组时返回cell。显然,您不能将数组转换为单个元素。

因此,与其将其存储到数组中,不如将其存储到一个单元格中。

for i = 1:15
    new_cell=cell(4);
    n=1;
    for fc = {vec_A, vec_B, vec_C, vec_D}
        new_cell{n}=fc(i);
        n=n+1;
    end
 Final_answers{i}=functionDoThings(new_cell);
end

希望有帮助!

【讨论】:

  • 这会有所帮助,但 functionDoThings 需要一个双精度数组。不过谢谢!
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多