-2

このサイトのユーザーの助けを借りて、マトリックスから列を削除するために次のようになりました。

a = [5 1 4; 2 1 1; 5 2 8];
n = size(a,1)
for i=1:n,  
    [v, i] = min(a(3,:));
    col = a(:, i);
    a(:, i) = [];
end

各反復の列を1つの行列に結合しようとしています。

助言がありますか?

4

3 に答える 3

3

3行目の要素の並べ替え順序を取得し、次の列を再シャッフルするために使用します。

[s idx] = sort(a(3, :);
a_new = a(:, idx);
于 2012-10-07T14:51:36.650 に答える
3

コードにいくつかの深刻な問題があります。

  1. ループ内でループ変数を再割り当てします。これは恐ろしい慣習であり、未定義の動作ではないにしても、デバッグが困難になる可能性があります。意味が異なるものには、常に一意の変数名を使用してください。

  2. i変数名として使用しています。iMatlabでは完全に合法ですが、 (およびj)も虚数単位を表すため、それでも悪い習慣と見なされます。数字としてではなく、変数名として1 = sin(x)使用していると言っているようなものです...ちょっと紛らわしいです。1

  3. 反復ごとに行列aのサイズを変更しています。これはパフォーマンス面で最善の方法ではありません。配列のサイズを変更すると、matlabは異なるサイズの新しい配列用にメモリを予約し、古い配列の内容を新しい配列にコピーして、古い配列を削除する必要があります。このようなループでコピーと削除を行うと、多くの時間がかかる可能性があり、必要がないため無駄になります。あなたはただすることができます

     a(:,i) = inf
    

    それ以外の

     a(:, i) = [] 
    
  4. あなたは車輪の再発明をしています。3行目の要素で行列を並べ替えたいようです。Matlabはそれを完全に可能にします:

    b = sortrows(a.',3).'
    

    または代わりに

    [~, inds] = sort(a(3,:);
    b = a(:, inds);
    

    Matlabは、通常はさまざまな方法で、考えられる行列に対して比較的基本的な操作を行うことができます。そして通常、それはあなたや私よりもはるかに優れた仕事をします。なぜなら、そのツールの多くは、何十年にもわたって何十人ものプログラマーによって開発、改善、デバッグされてきたからです。あなたや私よりも特定の領域があります。

于 2012-10-07T18:27:40.183 に答える
2

質問を理解できるかどうかはよくわかりません。これが欲しいですか:

a = [5 1 4; 2 1 1; 5 2 8];
n = size(a,1);
result = [];
for i=1:n
    [v, i] = min(a(3,:));
    col = a(:, i);
    result = [result col];
    a(:, i) = [];
end

結果は次のようになります。

 1     5     4
 1     2     1
 2     5     8
于 2012-10-07T14:45:55.667 に答える