我得到了一个关于评分系统的小项目。我发现如果我使用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
....
希望这里有人可以帮助我。感谢。
答案 0 :(得分:1)
您要找的是meshgrid
或bsxfun
。
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) ];