【问题标题】:How to add certain rows to a 2D matrix?如何将某些行添加到二维矩阵?
【发布时间】:2018-06-25 16:00:29
【问题描述】:

我在 MATLAB 中有一个像这样的简单二维矩阵:

A = [34 10;
     23 10;
     64 10];

我需要做的是找到max(A(:,1)),然后while A(j,1) < max(A(:,1))[A(j,1)+1 10] 之类的行添加到矩阵中,所以我想最终得到这个:

A = [34 10;
     35 10;
     36 10;
     37 10;
       .
       .
       .
     62 10;
     63 10;
     64 10;
       .
     23 10;
     24 10;
     25 10;
       .
       .
       .
     62 10
     63 10
     64 10
       .
     64 10];

我已经写了以下,但它不起作用:

for j = 1:size(A,1)
    while A(j,1) < max(A(:,1))
        A(end+1,:) = [A(j,1)+1 10];
    end
end

有什么想法可以做到吗?

【问题讨论】:

  • “我已经写了以下内容,但它不起作用”。没有
  • 准确完整地描述循环的作用以及为什么它与您想要的输出不同。不要指望其他人运行您的代码来找出您的实际问题。如果您的问题描述是“它不起作用”,那么您的问题在 99% 的情况下都是错误的。
  • 如果 max 不是最后一行,这个模式在 max 行之后的行继续吗?
  • 感谢您的建设性评论@MadPhysicist

标签: matlab for-loop while-loop


【解决方案1】:

对于没有循环的 Matlab,您可以尝试以下操作:

my_max = max(A(:,1));
my_arrays = arrayfun(@(x) [x:my_max]', A(:,1), 'uni', 0);
my_expanded_column = cat(1,my_arrays{:});
my_output = [my_expanded_column, 10*ones(size(my_expanded_column))]

它首先找到最大值, 然后将每个条目扩展到最大范围, 然后将所有范围合并为一个, 然后在 10 的第二列上添加。

【讨论】:

    【解决方案2】:

    你的 while 循环卡住了一遍又一遍地检查同一个元素(因为你没有增加任何东西)。

    您可以改为使用 for 循环从 A 的第一列中的每个元素开始计数。并确保将行添加到新矩阵,否则您的循环将递归扩展 A 无限。

    例如:

    B = [];
    index = 1; % keeps track of the last element of B
    
    for j = 1:size(A,1)
        for k = A(j,1):max(A(:,1))
            B(index,:) = [k A(j,2)];
            index = index + 1;
        end
    end
    

    【讨论】:

    • 太好了,现在我明白问题所在了,谢谢@frslm
    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2023-04-05
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多