【问题标题】:Extract the sequence matrix elements?提取序列矩阵元素?
【发布时间】:2013-03-05 08:16:03
【问题描述】:

我有一个如下图所示的矩阵:

A=[2 4;1 3;8 6;5 1;4 9]

现在我需要将矩阵 A 提取为 2 部分:

newpoint=[2 4];
rest=[1 3;8 6;5 1;4 9];

然后再次应用循环以提取第二列作为新点:

newpoint=[1 3];
rest=[2 4;8 6;5 1;4 9];

再次应用循环以将第三列号作为新点:

newpoint=[8 6];
rest=[2 4;1 3;5 1;4 9];

取行序列中的数字,直到最后一行。哪位好心人帮忙看看。谢谢~

【问题讨论】:

    标签: matlab loops matrix


    【解决方案1】:

    除了HebeleHododo的回答,如果你有大矩阵,也许你可以试试这个:

    A = [2 4; 1 3; 8 6; 5 1; 4 9];
    
    B = zeros(size(A,1)-1,size(A,2));
    
    for idx = 1:size(A, 1)
        newpoint = A(idx, :);
        B(1:idx-1,:) = A(1:idx-1,:);
        B(idx:end,:) = A(idx+1:end,:);
        % do stuff
    end
    

    它并没有摆脱for循环,而是预先分配了临时B矩阵,并且A和B之间的副本清晰,这样更快。

    对于A = rand(100000,2); HebeleHododo 的方法在我的计算机中需要大约 123 秒 上面那个需要大约 85 秒。

    编辑: 仅供参考,计时用Intel Core i5-3450 CPU @ 3.10GHzMatlab R2011b完成

    【讨论】:

      【解决方案2】:

      您说要提取列,但给出了行示例。我继续前进并假设您的意思是行。

      你可以用 for 循环来做到这一点。

      A = [2 4; 1 3; 8 6; 5 1; 4 9];
      
      for idx = 1:size(A, 1)
          newpoint = A(idx, :);
          rest = A; % Copy A to rest
          rest(idx, :) = []; % Remove newpoint line
          % do stuff
      end
      

      前两次迭代的结果:

      newpoint =
      
           2     4
      
      rest =
      
           1     3
           8     6
           5     1
           4     9
      
      newpoint =
      
           1     3
      
      rest =
      
           2     4
           8     6
           5     1
           4     9
      

      如果您的A 矩阵很大,这不是一个好方法。

      编辑:其实不要用这种方法。 George Aprilis 对其进行计时,发现 100000x2 矩阵需要 123 秒。我想我的电脑速度要慢得多。耗时 216 秒。我再说一遍,不要用这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 2011-08-10
        • 1970-01-01
        相关资源
        最近更新 更多