Có cách nào dễ dàng để chia từng phần tử ma trận theo tổng cột không? Ví dụ:Làm cách nào để phân chia các phần tử ma trận theo tổng cột trong MATLAB?
input:
1 4
4 10
output:
1/5 4/14
4/5 10/14
Có cách nào dễ dàng để chia từng phần tử ma trận theo tổng cột không? Ví dụ:Làm cách nào để phân chia các phần tử ma trận theo tổng cột trong MATLAB?
input:
1 4
4 10
output:
1/5 4/14
4/5 10/14
Dưới đây là một danh sách các cách khác nhau để thực hiện điều này ...
... sử dụng bsxfun
:
B = bsxfun(@rdivide,A,sum(A));
... sử dụng repmat
:
B = A./repmat(sum(A),size(A,1),1);
... sử dụng một outer product (theo đề nghị của Amro):
B = A./(ones(size(A,1),1)*sum(A));
... và sử dụng một vòng lặp for (theo đề nghị của mtrw):
B = A;
columnSums = sum(B);
for i = 1:numel(columnSums)
B(:,i) = B(:,i)./columnSums(i);
end
Cập nhật:
Kể từ MATLAB R2016b trở lên, hầu hết các hàm nhị phân tích hợp sẵn (danh sách có thể là f ound here) hỗ trợ mở rộng tiềm ẩn, có nghĩa là chúng có hành vi là bsxfun
theo mặc định. Vì vậy, trong các phiên bản MATLAB mới nhất, tất cả những gì bạn phải làm là:
B = A./sum(A);
Không thể cưỡng lại việc đọc danh sách. Nếu ma trận này được thể hiện trong danh sách các danh sách chính hàng, hãy thử điều này:
>>> A = [[1,4],[4,10]]
>>> [[float(i)/j for i,j in zip(a,map(sum,zip(*A)))] for a in A]
[[0.20000000000000001, 0.2857142857142857], [0.80000000000000004, 0.7142857142857143]]
Vâng, tôi biết điều này không siêu hiệu quả, vì chúng tôi tính toán tổng cột một lần mỗi hàng. Lưu điều này vào biến có tên colsums trông giống như:
>>> colsums = map(sum,zip(*A))
>>> [[float(i)/j for i,j in zip(a,colsums)] for a in A]
[[0.20000000000000001, 0.2857142857142857], [0.80000000000000004, 0.7142857142857143]]
Lưu ý rằng zip (* A) cho chuyển vị (A).
a=[1 4;4 10]
a =
1 4
4 10
a*diag(1./sum(a,1))
ans =
0.2000 0.2857
0.8000 0.7143
+1, tôi thích cái này. Tệ quá chậm hơn 20 lần so với 'bsxfun'. –
Bạn không thể ném vòng lặp chỉ để hoàn thành? :) – mtrw
@mtrw: Có, vâng tôi có thể. ;) – gnovice
bạn có thể thêm điều này vào danh sách: 'B = A ./ (số (kích thước (A, 1), 1) * tổng (A, 1))'. Tôi nghĩ rằng nó nhanh hơn * repmat * nhưng chậm hơn * bsxfun * – Amro