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

附加从矩阵中删除的列(matlab)?,matlab,matrix,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组合到一个矩阵中 有什么建议吗?我不太确定我是否理解这个问题。你想要这个吗: a = [5 1 4; 2 1 1; 5 2 8]; n = size(a,1); result = []

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

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组合到一个矩阵中


有什么建议吗?

我不太确定我是否理解这个问题。你想要这个吗:

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

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

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

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

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

  • 您正在使用
    i
    作为变量名。虽然在Matlab中完全合法,但它仍然被认为是不好的做法,因为
    i
    (和
    j
    )也表示虚单位。这就像说
    1=sin(x)
    ,你用
    1
    不是一个数字,而是一个变量名……有点让人困惑

  • 每次迭代都要调整矩阵a的大小。这不是提高性能的最佳方法——调整数组大小意味着matlab必须为不同大小的新数组保留内存,将旧数组的内容复制到新数组,然后删除旧数组。所有这些复制和删除在这样的循环中进行时可能会占用大量时间,而且是浪费时间的,因为不需要这样做;你可以这么做

     a(:,i) = inf
    
    而不是

     a(:, i) = [] 
    
  • 你在发明轮子。您似乎希望按矩阵第三行中的元素对矩阵进行排序。Matlab完全能够做到这一点:

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

    [~, inds] = sort(a(3,:);
    b = a(:, inds);
    
    Matlab能够对你能想到的矩阵进行任何相对基本的运算,通常也有多种方式。通常,它在这方面比你我做得好得多,这仅仅是因为它的许多工具都是多年来由数十名程序员开发、改进和调试的,其中许多人在某一领域比你我都更有天赋和经验


  • 正是我要找的!谢谢我需要的那部分就是你列出来的结果。。我没有意识到,在每次迭代中都需要添加到矩阵中。这是一个笑话,对吗?这个答案怎么能被投票和接受呢。答案很糟糕。它修改“i”,这是循环变量。这与各地使用的最基本的编程实践背道而驰。罗伯特H:我同意这不是一个好的做法,但这是对原始代码(我需要的部分…)进行最小修改的问题的确切答案。我不清楚这个问题的目的,所以我没有试图回答一些可能没有被问到的问题。我想说答案的质量与问题的质量完全相同。在循环中更改for循环变量不是好的做法。。你想达到什么目的?也许有更好的方法做这件事1.我什么都同意,尤其是。但不包括(2),关于
    i
    。在某些应用程序中使用虚数是非常罕见的,如果使用,则可以将使用范围限制为小的闭合函数。我理解这是相当主观的,我们可以整天讨论它,但是,以我的拙见,我不会称之为“坏习惯”。@Andrey,除非你用平方根做一些事情,并且根的论点无意中变成了否定。您会使用“size”作为变量名吗?实际上,最好使用1i或1j作为虚单位,并避免使用i和j作为变量。ii型或jj型有多难?谢谢你的意见。我试图描述一个更大的问题,同时使代码更简单,直截了当。我会记住这些。