【问题标题】:sorting array elements with condition [closed]使用条件对数组元素进行排序[关闭]
【发布时间】:2016-01-10 15:28:12
【问题描述】:

我有这样的数组

a =

24   700
10   500
36   560
50   240
10   600
30   500
70   450
10   200

预期的结果是

a =

10   500
36   560
24   700
10   200
50   240
30   500
10   600
70   450

这意味着在第一列中的元素(x)满足50或更大之后,它应该根据第二列对元素进行排序,之后它应该将第二列元素从x排序到下一个更高元素之前的元素。

谁能帮帮我??

【问题讨论】:

  • 不,先生,这是出于项目目的。这是为了根据对象的质心对对象位置进行某种排序。
  • 使用sort 和在循环中循环并不是很难:D 但我知道我们必须避免在 MATLAB 中使用循环,所以用矩阵来做这件事很有趣......
  • 嗯,你能再解释一下你想要什么吗?这很令人困惑..
  • 我想您可以在第 1 列中找到大于 50 的元素,然后您可以遍历这些索引。这会将代码减少到单个 for 循环,这应该是相当有效的。请注意,您实际上并没有为每个索引对整个数组进行排序,这也应该保持算法相当有效。
  • 遵循@patrik 的说明,如果第一行中的值超过 50,请小心

标签: arrays matlab sorting optimization


【解决方案1】:

这应该在这里工作。它可能有点粗糙,我没有尝试优化,但它可以完成工作。我还先添加了一个数字来考虑这种可能性。该代码基于您识别 >= 50 的元素并遍历每个块。

function A = fun1()

A = [50,900; 24,700; 10,500; 36,560; 50,240; 10,600; 30,500; 70,450; 10,200];

idx = find(A(:,1)>=50);
idx(idx>1) = idx(idx>1)-1; % Elements >=50 is included in next block
idx(end+1) = size(A,1); % Include final elements

[~,tmp] = sort(A(1:idx(1),2)); % First iteration outside
A(1:idx(1),:) = A(tmp,:);
for k = 2:length(idx)
    tmp=[];
    [~,tmp] = sort(A(idx(k-1)+1:idx(k),2));
    A(idx(k-1)+1:idx(k),:) = A(tmp+idx(k-1),:);
end

输出:

A = [50   900
10   500
36   560
24   700
50   240
30   500
10   600
10   200
70   450]

我认为值[10, 200] 是预期输出中的错误。否则,您必须在算法中包含环绕。不过这没有说明,所以我不能说清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2019-02-24
    • 2017-04-20
    • 2022-08-15
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多