通过本网站用户的帮助,我来到以下内容从矩阵中删除列:
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组合成一个矩阵。
有什么建议吗?
答案 0 :(得分:3)
获取第三行元素的排序顺序,并用于重新排列a:的列:
[s idx] = sort(a(3, :);
a_new = a(:, idx);
答案 1 :(得分:3)
您的代码中存在一些严重问题:
您在循环内重新分配循环变量。这是一种可怕的做法,如果不是未定义的行为,可能导致一些难以调试的行为。始终对具有不同含义的事物使用唯一变量名称。
您使用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能够对你能想到的矩阵进行任何相对基本的操作,通常也可以通过各种方式进行。通常情况下,它比你或我做得好得多,仅仅因为它的许多工具已经被多年来开发,改进和调试,数十个程序员,其中许多人更有才华和经验丰富某个区域比你或我将永远。
答案 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