提取序列矩阵元素?

时间:2013-03-05 08:16:04

标签: matlab loops matrix

我有一个矩阵,如下所示:

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

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

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];

获取行序列中的数字,直到最后一行。有人可以帮助。谢谢〜

2 个答案:

答案 0 :(得分: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秒。我再说一遍,不要用这个。

答案 1 :(得分:2)

除了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

完成时间安排