追加从矩阵(matlab)中删除的列?

时间:2012-10-07 14:26:07

标签: matlab matrix

通过本网站用户的帮助,我来到以下内容从矩阵中删除列:

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

我希望将每个迭代的col组合成一个矩阵。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

获取第三行元素的排序顺序,并用于重新排列a:的列:

[s idx] = sort(a(3, :);
a_new = a(:, idx);

答案 1 :(得分:3)

您的代码中存在一些严重问题:

  1. 您在循环内重新分配循环变量。这是一种可怕的做法,如果不是未定义的行为,可能导致一些难以调试的行为。始终对具有不同含义的事物使用唯一变量名称。

  2. 您使用i作为变量名称。尽管在Matlab中完全合法,但它仍然被认为是不好的做法,因为i(和j)也表示想象单位。这就像说1 = sin(x),你在1使用的不是数字,而是变量名......有点令人困惑。

  3. 您在每次迭代时调整矩阵a的大小。这不是性能方面的最佳方式 - 调整数组大小意味着matlab必须为不同大小的新数组保留内存,将旧数组的内容复制到新数组,并删除旧数组。所有这些复制和删除都会花费大量时间在这样的循环中完成,并且因为不需要而浪费;你可以做到

     a(:,i) = inf
    

    而不是

     a(:, i) = [] 
    
  4. 你正在重新发明轮子。您似乎想要按第三行中的元素对矩阵进行排序。 Matlab完全有能力:

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

    或者

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

    Matlab能够对你能想到的矩阵进行任何相对基本的操作,通常也可以通过各种方式进行。通常情况下,它比你或我做得好得多,仅仅因为它的许多工具已经被多年来开发,改进和调试,数十个程序员,其中许多人更有才华和经验丰富某个区域比你或我将永远。

答案 2 :(得分: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