1

採点システムに関する小さなプロジェクトがあります。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
....

ここの誰かが私を助けてくれることを願っています。ありがとう。

4

2 に答える 2

1

あなたが探しているものはmeshgrid、またはのいずれかbsxfunです。メッシュグリッド ソリューション:

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 の各次元に沿って、2 番目のオペランドに一致するのに必要なだけ繰り返されます。

したがって、上記の 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]);
于 2012-06-15T10:11:34.350 に答える
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) ];
于 2012-06-15T11:23:59.950 に答える