2009-11-20 73 views

Trả lời

41

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); 
+2

Bạn không thể ném vòng lặp chỉ để hoàn thành? :) – mtrw

+0

@mtrw: Có, vâng tôi có thể. ;) – gnovice

+2

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

0

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).

+2

Đó có phải là Python không? – gnovice

+0

Ồ, xin lỗi, đúng vậy. Tôi không chú ý đến thẻ Matlab. – PaulMcG

1
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 
+0

+1, tôi thích cái này. Tệ quá chậm hơn 20 lần so với 'bsxfun'. –

Các vấn đề liên quan