Sort Matrix Array and skip zeros.

I have an array as this:
Array1 = [1 2 3 4 0 0;
1 2 3 0 0 0;
1 0 0 0 0 0;
1 2 0 0 0 0];
Array1 is sorted and is fine as it is. But lets say I type in a mistake like this:
Array2 = [2 1 3 4 0 0;
1 2 3 0 0 0;
1 0 0 0 0 0;
1 2 0 0 0 0];
Now coulomb 1 in Array2 is not sorted and I would like to sort it. But when I try to sort it with the function sort(Array2(1,:)) the zeros (0) will be listed first. Its easy to understand why it does this because 0 is smaller then 1,2,3,4, etc. It will then look like:
Array2 = [0 0 1 2 3 4;
1 2 3 0 0 0;
1 0 0 0 0 0;
1 2 0 0 0 0];
But I would like the array to look like Array1:
Array2 = [1 2 3 4 0 0;
1 2 3 0 0 0;
1 0 0 0 0 0;
1 2 0 0 0 0]
How is this possible? Can I somehow sort an array and skip the zeros?
Your Sincerely.

4 件のコメント

Adam
Adam 2014 年 9 月 1 日
Do you want the 0's to always be at the end of the rows or to stay where they are while everything else is sorted around them?
e.g. if you have a row
1 3 0 2 4
do you want
1 2 3 4 0
or
1 2 0 3 4?
Kalle
Kalle 2014 年 9 月 2 日
I would like the zeros to always be on the end. So if its 1 3 0 2 4 they should be sorted as 1 2 3 4 0.
Guillaume
Guillaume 2014 年 9 月 2 日
Adam's or the second option in my answer will give you that.
Kalle
Kalle 2014 年 9 月 2 日
Ye I noticed. Thanks. :)

サインインしてコメントする。

 採用された回答

Adam
Adam 2014 年 9 月 1 日

3 投票

Array1( Array1 == 0 ) = NaN;
Array2 = sort( Array1, 2 );
Array2( isnan( Array2 ) ) = 0;
works if you want 0s shuffled to the end, though not if you want them to remain exactly where they are.

2 件のコメント

Kalle
Kalle 2014 年 9 月 2 日
This is exactly what I was looking for. Thanks. :)
Kalle
Kalle 2014 年 9 月 2 日
Right now I use the zeros for filling the Matrix and in the end I need to implement it in a c function and test it in a lab. Nice and clean way to sort the Array. Thanks.

サインインしてコメントする。

その他の回答 (3 件)

Guillaume
Guillaume 2014 年 9 月 1 日

0 投票

One possible way:
for row = 1:size(Array2, 1)
Array2(row, 1:nnz(Array2(row, :))) = nonzeros(sort(Array2(row, :)));
end
Or if zeros are not always at the end in the original matrix:
ncol = size(Array2, 2);
for row = 1:size(Array2, 1)
Array2(row, :) = [nonzeros(sort(Array2(row, :))); zeros(ncol - nnz(Array2(row, :)), 1)];
end

1 件のコメント

Kalle
Kalle 2014 年 9 月 2 日
Thanks for your time, but Adam answered my question. :)

サインインしてコメントする。

Ilham Hardy
Ilham Hardy 2014 年 9 月 1 日

0 投票

If you know the starting value (say sort start from 1, instead of 0):
tblA = [2 1 3 4 0 0];
vStartSort = 1
tblA = sort(tblA);
tblA = circshift(tblA, [1, -find(tblA == vStartSort, 1) + 1]);
If you just want to skip zero (you don't know the smallest value after zero in array)
tblA = [2 1 3 4 0 0];
tblA = sort(tblA);
minGreaterThanZero = tblA(tblA>0);
vStartSort = minGreaterThanZero(1);
tblA = circshift(tblA, [1, -find(tblA == vStartSort, 1) + 1]);
HTH, IH

1 件のコメント

Kalle
Kalle 2014 年 9 月 2 日
Thanks for your time Ilham Hardy. Adam gave me exactly what I was looking for. Maybe that wasnt so clear after all. But thanks anyways. :) Always nice to learn other methods.

サインインしてコメントする。

Image Analyst
Image Analyst 2014 年 9 月 1 日

0 投票

This will give you exactly what you want, with zeros remaining in the original locations.
Array2 = [2 1 3 4 0 0;
1 2 3 0 0 0;
1 0 0 0 0 0;
1 2 0 0 0 0]
% Find locations of non-zeros.
% Transpose array first so we can sort column-major fashion.
nonZeroIndexes = Array2(:).'~=0
% Extract the values from those locations.
nonZeroValues = Array2(nonZeroIndexes)
% Sort them.
sortedValues = sort(nonZeroValues)
% Get an array with the zeros in their original locations.
out = Array2(:); % Initialize
% Assign only those elements in non-zero locations.
% This will still be a column vector.
out(nonZeroIndexes) = sortedValues(:)
% Reshape to original 2D size of Array2.
out = reshape(out, size(Array2))
In command window.
out =
1 2 3 4 0 0
1 2 3 0 0 0
1 0 0 0 0 0
1 2 0 0 0 0

1 件のコメント

Kalle
Kalle 2014 年 9 月 2 日
This is a great solution if the zeros should be in the original locations. Right now I need the zeros to be placed in the end of the Matrix, since the zeros is only for filling the matrix. Adam gave me a simple answer to this. Thanks for your time though.

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeShifting and Sorting Matrices についてさらに検索

質問済み:

2014 年 9 月 1 日

コメント済み:

2014 年 9 月 2 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by