sort()函数对行/列进行排序,但是如何对元素进行绝对排序?结果应该是另一个矩阵,其中(1,1)中的元素最小,(1,2)中的第二个最小,等等。
答案 0 :(得分:3)
取一些随机输入
input = rand(5,10);
如果您希望输出为行向量,只需使用
即可sortedRow = sort(input(:)).';
如果您希望结果与输入的形状相同,请使用
sortedOriginalShape = reshape(sort(input(:)), size(input,2), size(input,1)).';
请注意,在保持形状时,我们必须使用反转的size
尺寸,然后进行转置。这是因为否则结果是按列的,即(1,1)中的最小元素,(2,1)等中的最小元素,这与您请求的相反。
答案 1 :(得分:3)
您可以使用列运算符(:
)来矢量化' nxm'的所有元素。矩阵作为' nxm'的向量元素并对此向量进行排序。然后你可以使用直接分配或重塑'将元素存储为基本形式的函数。
您需要知道的是matlab使用column-major-ordering来向量化/迭代元素:
A = rand(3, 5);
A(:) = sort(A(:);
将保留colum-major-ordering,或者如您所说,您更喜欢行主要排序:
A = rand(3, 5);
A = reshape(sort(A(:)), fliplr(size(A)).';
请注意fliplr
按列反向存储,然后.'
运算符再次转置结果。
修改强>
即使matlab使用列主要排序在内存中存储元素,下面是两个通用例程来处理行主要顺序,无论数组的维数是多少(即不限于2D):
function [vector] = VectorizeWithRowMajorOrdering(array)
%[
axisCount = length(size(array)); % Squeezed size of original array
permutation = fliplr(1:(axisCount + 2)); % +2 ==> Trick to vectorize data in correct order
vector = permute(array, permutation);
vector = vector(:);
%]
end
function [array] = ReshapeFromRowMajorOrdering(vector, siz)
%[
siz = [siz( : ).' 1]; % Fix size if only one dim
array = NaN(siz); % Init
axisCount = length(size(array)); % Squeezed size!
permutation = fliplr(1:(axisCount + 2)); % +2 ==> Trick to vectorize data in correct order
array = reshape(vector, [1 1 fliplr(size(array))]);
array = ipermute(array, permutation);
%]
end
这在处理来自C / C ++的数据时很有用(这些语言使用行主要排序)。在你的情况下,这可以这样使用:
A = rand(3, 5);
A = ReshapeFromRowMajorOrdering(sort(A(:)), size(A));