【问题标题】:Iterative function outputs into matrices迭代函数输出到矩阵
【发布时间】:2016-02-13 07:04:40
【问题描述】:

我有一个迭代函数,它给了我两个向量输出。如何将这些输出存储到 Matlab 中的两个单独的矩阵中?

[A, B]=iterative_function(x,y)

A 和 B 的大小不变,都是 1x4。

有没有办法在没有“细胞”的情况下做到这一点?

【问题讨论】:

    标签: matlab loops vector iteration


    【解决方案1】:

    如果我理解正确,您想连接每次迭代输出的所有AB。如果它们的大小永远不会改变,则无需使用元胞数组,您可以使用常规矩阵。
    您的 AB 是行向量,因此假设您要将每个结果连接为一行。

    A_total=[];
    B_total=[];
    while(your loop is going)
        [A, B]=iterative_function(x,y)
        A_total=[A_total ; A];
        B_total=[B_total ; B];
    end
    

    如果您事先知道循环将完成多少次迭代,您也可以预先分配此类矩阵 A_totalB_total 并将每个 AB 分配给 i-th 行:

    A_total=zeros(MaxIteration,4); %because A has length 4
    B_total=zeros(MaxIteration,4); %because B has also length 4
    for i=1:MaxIterations
        [A, B]=iterative_function(x,y)
        A_total(i,:)=A;
        B_total(i,:)=B;
    end
    

    更新:正如@Max 正确指出的那样,我认为也值得知道即使您的向量是不是行向量,而是列向量。主要技巧是,现在您没有分配 1 行 = 1 个向量,而是 1 列 = 1 个向量。假设AB 不是1x4,而是4x1。这样的连接可以很容易地完成如下(在循环内):

        A_total=[A_total , A]; % a space without a comma works just as well
        B_total=[B_total , B];
    

    或者,如果您事先知道迭代次数,您可以通过这种方式预先分配:

    A_total=zeros(4,MaxIteration); %because A has length 4
    B_total=zeros(4,MaxIteration); %because B has also length 4
    

    这一次,您将拥有与迭代一样多的列,而在前一种情况下,您将拥有与迭代一样多的行。 在循环内部,您可以用这种方式替换第 i 列:

        A_total(:,i)=A;
        B_total(:,i)=B;
    

    冒号运算符 (:) 表示“所有这些”(即表达式 A_total(:,i) 表示第 i 列和所有行)在哪里(我的错,我之前没有解释)。

    最后,这两种方法都有效,因为AB 具有相同的大小并且永远不会改变。尽管如果由于任何原因导致这些大小不同,Matlab 将不允许您连接这些向量,并且您唯一的机会依赖于元胞数组。如您所料,只有在所有向量都具有相同大小的情况下才能创建矩阵(即,您不能将长度为 4 的数组和长度为 5 的数组连接成两行)。相反,元胞数组是一种异构数据结构,因此每个元胞都可以包含您喜欢的任何数据。

    【讨论】:

    • 由于他似乎不熟悉连接矩阵,您不妨在答案中添加您可以对列向量执行相同操作,但必须省略“;”或将其替换为“,”。
    猜你喜欢
    • 2016-05-23
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多