将整个矩阵排序为仅一列

时间:2012-06-15 09:22:56

标签: matlab sorting matrix

我得到了一个关于评分系统的小项目。我发现如果我使用excel操作它,它肯定会给我带来很多时间。我希望我得到你们的帮助。

A = [10 20 30 40 ...]       % (1xm array)
B = [0.02; 0.04;...]        % (nx1 array)
F = A/B                     % F should be (n x m matrix)
Z = zero (size(nxm), 3)     % I'm trying to create a matrix with n x m row and 3 column)

我想将F排序为Z(1:end),Z(1:end)各自的A将在Z(2:end)中,并且各自的B将在Z(3:end)中。我可以知道我应该如何用Matlab写作?

示例:

       10      20    30    40    50 ...
0.02  500     1000  1500  2000   2500
0.04  250     500   750   1000   1250
0.06 166.67 333.33  500  666.67  833.33 
...

输出Z

166.67  10  0.06
250     10  0.04
333.33  20  0.06
....

希望这里有人可以帮助我。感谢。

2 个答案:

答案 0 :(得分:1)

您要找的是meshgridbsxfun。 meshgrid解决方案:

A=[10 20 30 40];
B=[0.02 0.04 0.06 0.08];
[x,y]=meshgrid(A,B); % Generate 2 matrices having the elements to divide
F=x./y;              % Do elemnt-by-element divide
Z=[F(:),x(:),y(:)];  % put all values from the matrices together as columns,
                     % using linear indexing (:).

bsxfun解决方案更紧凑,更快,但可读性更低:

F=bsxfun(@rdivide,A',B); % Put the transpose at B if you want it 
                       % sorted along B.
x=bsxfun(@times,A,ones(size(B,2),1));  % a matric containing A as columns
y=bsxfun(@times,ones(1,size(A,2)),B'); % a matrix containing B repeated as rows
Z=[F(:),x(:),y(:)];

bsxfun的诀窍在于它可以进行单例扩展。输入沿着长度为1的每个维度重复,与第二个操作数匹配所需的数量。

所以在上面的4x4案例中你有(伪代码):

[10 20 30 40] .* [0.01;
                  0.02;
                  0.04;
                  0.06]

将扩展为(也是伪代码):

[10 20 30 40;    [0.01 0.01 0.01 0.01;
 10 20 30 40; .*  0.02 0.02 0.02 0.02;
 10 20 30 40;     0.04 0.04 0.04 0.04;
 10 20 30 40]     0.06 0.06 0.06 0.06]

您似乎希望按F排序:您可以使用

轻松完成此操作
Z_sort = sortrows(Z,[1]);

答案 1 :(得分:1)

这是使用reshape和线性寻址的解决方案:

输入数据(A是行向量,B是列向量):

A = [ 10, 20, 30, 40 ];
B = [ 0.02; 0.04; 0.06; 0.08 ];

以下是代码:

F = bsxfun(@rdivide, A, B);
Fvector = reshape(F, 1, numel(F));

[SortedFvector, IX] = sort(Fvector);
Aindices = ceil(IX/size(B, 1));

Bindices = mod(IX, size(B, 1));
Bindices(Bindices == 0) = size(B, 1);

Z = [ SortedFvector', A(Aindices)', B(Bindices) ];