2011-08-26 36 views
18

Khi gọi norm trên ma trận trong MATLAB, nó trả về cái được gọi là "chuẩn mực ma trận" (giá trị vô hướng), thay vì một mảng các chỉ tiêu vectơ. Có cách nào để có được các chỉ tiêu của mỗi vector trong một ma trận mà không lặp và tận dụng lợi thế của vector hóa MATLAB?Chỉ tiêu Vector của một mảng vectơ trong MATLAB

+0

tổng hợp là gì? –

Trả lời

24

Bạn có thể tính toán chỉ tiêu của từng cột hoặc hàng của ma trận bằng cách sử dụng element-wise arithmetic operators và các hàm được xác định để hoạt động trên các kích thước ma trận đã cho (như SUMMAX). Đây là cách bạn có thể tính toán một số chỉ tiêu cột-khôn ngoan cho một ma trận M:

twoNorm = sqrt(sum(abs(M).^2,1)); %# The two-norm of each column 
pNorm = sum(abs(M).^p,1).^(1/p); %# The p-norm of each column (define p first) 
infNorm = max(M,[],1);   %# The infinity norm (max value) of each column 

Những chuẩn mực có thể dễ dàng được thực hiện để hoạt động trên các hàng thay vì các cột bằng cách thay đổi các tham số chiều từ ...,1 để ...,2.

+3

có lẽ bạn nên chỉ định rõ ràng các kích thước mà SUM và MAX hoạt động, theo cách đó sẽ dễ dàng chuyển sang các chỉ tiêu khôn ngoan theo hàng ... – Amro

+0

@Amro: Đề xuất tốt. Làm xong! – gnovice

+2

Nếu 'M' chỉ bao gồm các số thực, bạn có thể thay thế' abs (M) 'bằng' M' trong 'haiNorm' khi'.^2' hủy bỏ bất kỳ dấu hiệu âm nào. – kroimon

1

Việc triển khai hiện tại cho hai chuẩn có thể được cải thiện.

twoNorm = sqrt(sum(abs(M).^2,1)); # The two-norm of each column 

abs(M).^2 sẽ tính toán toàn bộ các rễ vuông không cần thiết vừa được bình phương thẳng.

Viễn tốt hơn để làm:

twoNorm = sqrt( 
       sum(real(M .* conj(M)), 1) 
      ) 

này xử lý một cách hiệu quả thực tế và phức tạp M.

Sử dụng real() đảm bảo rằng sumsqrt hành trên số thực (chứ không phải là số phức với 0 phần tưởng tượng).

0

Từ phiên bản 2017b trở đi, bạn có thể sử dụng vecnorm.

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