-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

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

有什么建议么?

4

3 回答 3

3

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

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

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

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

  2. 您正在i用作变量名。尽管在 Matlab 中完全合法,但它仍然被认为是不好的做法,因为i(and 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 能够对您能想到的矩阵进行任何相对基本的操作,通常也可以采用多种方式。通常,它在这方面做得比你或我好得多,仅仅是因为它的许多工具已经由数十名程序员多年来开发、改进和调试,其中许多人在这方面更有才华和经验比你或我永远存在的某个领域。

于 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 回答