如何进行这种排序(在MATLAB中)?

时间:2015-06-17 19:37:13

标签: matlab sorting matrix vector

我有一个方形矩阵,我希望得到一个2乘n矩阵,它将按排序顺序包含矩阵索引。例如,我想从这个矩阵中获取

0 0 0

1 0 0

2 3 0

类似这样的事情

[3 2; 3 1; 2 1] ....

(3,2)是矩阵中最大元素的指数,(3,1)是第二大元素,依此类推。如果它可以忽略零(或NaN-s而不是零)将是好的。

关于矩阵的其他信息:它是正的,但不一定是3乘3,对角线元素和对角线上方的每个元素都是0或NaN(一个副问题,处理得更快,NaNs还是0?)

3 个答案:

答案 0 :(得分:3)

这只考虑非零元素:

$i="0";
$max=$_POST['ivalue'];    //total number of rows

++$max;
while ($i < $max)
{
$ID0    =   "ID$i";
$name0  =   "name$i";
$date0  =   "rdate$i";
$start0 =   "start-time$i";
$end0   =   "end-time$i";
$location0 =    "location$i";
$leavetype0=    "leavetype$i";
$comment0  =    "comment$i";


$users_ID = $_POST[$ID0];
$users_name = $_POST[$name0];       
$users_date= $_POST[$date0];            
$users_start = $_POST[$start0];
$users_end = $_POST[$end0];
$users_location = $_POST[$location0];
$users_leavetype = $_POST[$leavetype0];
$users_comment = $_POST[$comment0];

$users_ID = mysql_real_escape_string($users_ID);    
$users_name = mysql_real_escape_string($users_name);
$users_date= mysql_real_escape_string($users_date);
$users_start = mysql_real_escape_string($users_start);
$users_end = mysql_real_escape_string($users_end);
$users_location = mysql_real_escape_string($users_location);
$users_leavetype = mysql_real_escape_string($users_leavetype);
$users_comment= mysql_real_escape_string($users_comment);

mysql_query("INSERT INTO `mydb_mydb`.`mydb` (`datename` `ID`, `name`, `location`, `start`, `end`, `date`, `Leavetype`, `comments`) VALUES ('$users_leavetype$users_date$users_name', '$users_ID', '$users_name', '$users_location', '$users_start', '$users_end', '$users_date', '$users_leavetype', '$users_comment') ON DUPLICATE KEY UPDATE `start`='$users_start', `end`='$users_end', `Leavetype`='$users_leavetype', `comments`= '$users_comment' ");
++$i;}

mysql_close();
?>

答案 1 :(得分:1)

假设您的矩阵在A,您需要使用ind2sub函数,

编辑删除零指数

[Ap, i] = sort(A(:), 'descend');
[r,c] = ind2sub(size(A), i);
orderedPairs = [r,c];
orderedPairsSansZeros = orderedPairs(Ap ~= 0, :);

答案 2 :(得分:0)

以下内容应该有效。矩阵sortix是您正在寻找的。我用NaN替换了你的(1,3)元素中的零,所以你可以看到NaN没有出现在你的最终有序矩阵中。

matrix = [0, 0, NaN;
          1, 3, 0;
          2, 3, 0];

new_matrix = matrix;

%new_matrix(new_matrix(:)==0) = NaN; % uncomment to get rid of zeros

saveix = 1;

for i=1:length(matrix(:))
    [maxVal, maxIndex] = max(new_matrix(:));

    allMax = ismember(new_matrix, maxVal);
    idx = find(allMax);

    for ix=1:length(idx)
        [sortix(saveix, 1), sortix(saveix, 2)] = ind2sub(size(matrix), ...
            idx(ix));
        saveix = saveix + 1;
    end

    new_matrix(idx) = NaN;
end