【问题标题】:Adding row to matrix in if statement MATLAB在if语句MATLAB中向矩阵添加行
【发布时间】:2016-03-05 20:21:19
【问题描述】:

我有一个代码可以做到这一点:

A = [2;3;4;5;6;7];
b = 2;
B(10).b = zeros(6,1);

for i = 1:10
    C = A;
    B(i).b = C.*(b^i);
    if i>1
        if B(i).b(1,1)-B(i-1).b(1,1)>50
            C(7) = b;
        end
    end
end

问题在于,在每次迭代中,C 矩阵都被矩阵 A 中的值替换。这是我的代码的简化版本,但本质就在这里,代码应该做到这一点,如果条件是遇到,将另一行添加到矩阵 C 并继续使用矩阵 C 中的该行执行代码。可以这样做吗?我非常感谢您的想法。谢谢。

【问题讨论】:

  • 我不明白你的意思,请解释一下,
  • 起点是C矩阵,它是进行计算的矩阵。完成一些计算后,将比较是否满足标准。如果该陈述为真,则向 C 矩阵添加一行。问题是,在这段代码中,由于行 C = A,在添加行并开始另一次迭代后,当加载 C 矩阵的起始值时,同一行被删除。我需要能够将行添加到矩阵 C 并继续使用添加的行执行计算。我希望现在更清楚了,@Rashid
  • 那你为什么不在循环外设置C=A,在第一个for之前,不就解决问题了吗?
  • 因为需要在该矩阵上进行计算,并且它(C 矩阵)在完整代码中是可变的,所以在每次迭代完成并且ifstatement 不正确后, C矩阵的值必须返回到起点
  • 好吧,这很有道理,C(1:6) = A 有帮助吗?因为看起来AC都是向量,

标签: matlab if-statement for-loop matrix iteration


【解决方案1】:

您可以将 b 附加到 C 并用新创建的值覆盖 C 的值:

if i>1
    if B(i).b(1,1)-B(i-1).b(1,1)>50
        C = [C; b];
    end
end

只要 C & b 不太大,这应该可以正常工作。

【讨论】:

  • 感谢您的回答,@Rashid 的回答帮助我解决了这个问题。但由于这是一条评论,我不能接受它为有效并标记为已解决。
【解决方案2】:

不建议在执行期间更改矩阵大小,因为您会丢失运行时间。最好的解决方案是在一开始就估计矩阵的大小。

如果没有其他可能,可以通过以下代码添加一行:

A = [1 2; 3 4];
A = vertcat(A,[2 3]); 

同样适用于列:

A = [1 2; 3 4];
A = horzcat(A,[2; 3]);

要删除一行,只需写(此处为第 2 行):

A(2,:) = [];

同样适用于列:

A(:,2) = [];

要仅更改矩阵的选择性部分,可以执行以下操作(一些示例):

A(1:2,1) = [2 3]; % change row
A(1,1:2) = [2;3]; % change column
A(2,1) = 5; % change single cell

这正是 Rashid 对语句 C(1:6) = A; 所做的。因为它只是一个列向量,所以索引指的是列。相当于 C(1,1:6)=A;

那么,将 if 语句与您想要的条件放在一起只是一个实施问题。

最好的问候

【讨论】:

  • 感谢@Sebastian 的回复。无法估计矩阵的大小,因为它取决于无法预测的计算结果。至于递归函数,我不明白如何实现以避免代码行 C = A 删除添加的行。
  • @Drazen:我改变了我的回答。一开始并不清楚你真正想要什么。我知道您想知道如何在矩阵中添加一行。因此,我编写了一些独立的示例来向您展示如何添加行。现在它还包含 Rashid 的解决方案。所以基本上你可以关闭线程。在您的情况下,递归函数当然不是必需的。
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多