0

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

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

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

4

2 回答 2

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 秒。我再说一遍,不要使用这个。

于 2013-03-05T08:24:00.730 回答
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

于 2013-03-05T09:10:20.977 回答