0

以下に示すようなマトリックスがあります。

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

次に、ループを再度適用して、2 番目の列を新しいポイントとして抽出します。

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

ループを再度適用して、3 番目の列番号を新しいポイントとして取得します。

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

最後の行まで行の順序で番号を取得します。誰か親切に助けてくれませんか.Thanks~

4

2 に答える 2

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 の間のコピーが明確になるため、処理が速くなります。

HebeleHododoA = rand(100000,2);の方法では、私のコンピューターでは約 123 秒かかり、上記の方法では約 85 秒かかります。

編集: 参考までに、タイミングはとを使用して行われIntel Core i5-3450 CPU @ 3.10GHzますMatlab R2011b

于 2013-03-05T09:10:20.977 に答える
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

最初の 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

Aマトリックスが大きい場合、これは良い方法ではありません。

編集:実際、この方法は使用しないでください。ジョージ・アプリリスはそれを計り、100000x2 マトリックスで 123 秒であることを発見しました。私のコンピューターはかなり遅いと思います。216秒かかりました。繰り返しますが、これは使用しないでください。

于 2013-03-05T08:24:00.730 に答える