通过本网站用户的帮助,我来到以下从矩阵中删除列:
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 的列:
[s idx] = sort(a(3, :);
a_new = a(:, idx);
您的代码中有一些严重的问题:
您在循环内重新分配循环变量。这是一种可怕的做法,如果不是未定义的行为,可能会导致一些难以调试的行为。始终对具有不同含义的事物使用唯一的变量名。
您正在i
用作变量名。尽管在 Matlab 中完全合法,但它仍然被认为是不好的做法,因为i
(and 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 能够对您能想到的矩阵进行任何相对基本的操作,通常也可以采用多种方式。通常,它在这方面做得比你或我好得多,仅仅是因为它的许多工具已经由数十名程序员多年来开发、改进和调试,其中许多人在这方面更有才华和经验比你或我永远存在的某个领域。
我不太确定我是否理解这个问题。你想要这个吗:
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