2013-08-27 23 views
6

Tôi đang viết bài tập về nhà và tôi gặp lỗi này khi sử dụng Octave. Nó không ảnh hưởng đến chức năng của giải pháp của tôi, tuy nhiên tôi tò mò tại sao cảnh báo này đang được phát ra.'hoạt động phát sóng tự động được áp dụng' trên các ma trận có kích thước bằng nhau

% X is column vector, p is max degree of polynom 
% example: 
% X = [1;2;3;4], p = 3 
% X_poly = [1,1,1; 2,4,8; 3,9,27; 4,16,64] 
function [X_poly] = polyFeatures(X, p) 

powers = ones(numel(X),1) * linspace(1,p,p); 
X_poly = X .^ powers; 

end 

Kính trọng,
Tom

Trả lời

3

Bắt đầu phân tích với điều này:

powers = ones(numel(X),1) * linspace(1,p,p); 

Yếu tố còn lại rõ ràng là numel(X) -by- 1, và các yếu tố thích hợp là 1 -by- p và bạn nhận được ma trận là numel(X) -by- p.

Sau đó, đây là vấn đề:

X_poly = X .^ powers; 

Các toán hạng bên trái là numel(X) -by- 1 và các toán hạng bên phải là numel(X) -by- p. Những thứ này không khớp.

Tôi nghĩ nó chỉ đơn giản là một lỗi, nhưng quãng tám dường như đang cố gắng tìm ra ý của bạn thay vì những gì bạn viết, nhưng sau đó cho bạn một cảnh báo rằng nó đang đoán.

Để mở rộng singleton, bạn có thể sử dụng bsxfun hoặc repmat.

X_poly = bsxfun(@power, X, powers); 
X_poly = repmat(X, 1, p) .^ powers; 

Kể từ khi gán để powers chỉ là một cách lộn xộn để làm repmat, và bsxfun sẽ mở rộng cả các thông số, bạn có thể thay vì chỉ làm:

X_poly = bsxfun(@power, X, 1:p); 

mà làm cho nó hơi vô nghĩa để có một đặc biệt chức năng cho mục đích này.

enter image description here

+0

Tôi có thể đã sử dụng bsxfun, nhưng vì mục đích tập thể dục, tôi muốn tự mình thực hiện hành vi này. Chỉ có điều cần thiết để làm cho mã của tôi làm việc là để chuyển đổi X cũng sau đó. quyền hạn = số (numel (X), 1) * khoảng trống (1, p, p); Xs = X * (1, p); X_poly = Xs.^Quyền hạn; Cảm ơn bạn rất nhiều;) –

+1

"Tôi nghĩ nó chỉ đơn giản là một lỗi, nhưng quãng tám dường như đang cố gắng tìm ra ý của bạn thay vì những gì bạn viết, nhưng sau đó đưa ra cảnh báo rằng nó đang đoán". Đó không phải là lý do. Một phần của ngôn ngữ Octave là tự động phát sóng (lấy cảm hứng từ NumPy), vì vậy những gì bạn viết trong những tình huống * là * phát sóng. Lý do cảnh báo là nó là một tính năng mới và có thể khiến mọi người bất ngờ. Những loại cảnh báo này thường bị xóa sau 2 lần phát hành. – carandraug

+1

@carandraug: Vâng, câu hỏi cũng được gắn thẻ 'matlab', và nó là bất hợp pháp ở đó. –

12

phát sóng tự động là một tính năng khá mới Octave mà ném trong một bsxfun bất cứ nơi nào có sự không phù hợp chiều giữa một singleton và kích thước của non-singleton.

Trong trường hợp này

X_poly = X.^Powers;

được thay thế bằng

X_poly = bsxfun (@power, X, powers);

Đây là hành vi octave hợp pháp hoàn hảo và hơn nữa nó dường như chính xác những gì bạn muốn làm, vì vậy bạn không để thay đổi nó.

Cảnh báo là vì Matlab không hỗ trợ phát sóng tự động để họ muốn nhắc bạn nếu bạn cố gắng chạy mã này trong Matlab nó sẽ thất bại.

Hơn nữa, thực hành phổ biến trong số nhiều lập trình viên Octave là dựa chủ yếu vào kích thước không phù hợp như một cách để phát hiện lỗi trong chương trình của họ.Tôi thậm chí đã từng học một lớp học máy mà giáo sư nói với cả lớp "Nếu tất cả các kích thước đều xếp hàng, thì có lẽ nó đúng". Đây là một lời khuyên khủng khiếp, khủng khiếp và chắc chắn rằng tất cả mọi người đều thất bại trong bài tập về nhà, nhưng nó phản ánh một cách tiếp cận chung giữa nhiều nhà nghiên cứu để viết các chương trình Matlab/Octave.

Vì lý do này, việc giới thiệu phát sóng tự động mà không có bất kỳ cảnh báo nào có thể gây khó khăn cho bạn nếu bạn không có thói quen xác nhận rõ ràng về đầu vào chức năng của mình.

Nếu bạn muốn thoát khỏi cảnh báo, bạn chỉ có thể thêm

warning("off", "Octave:broadcast"); 

mã của bạn.

Nếu bạn muốn duy trì khả năng tương thích tốt hơn Matlab hoặc chỉ không sử dụng phát sóng tự động và thà có lỗi quãng tám để giúp cô lập lỗi, bạn có thể thêm

warning ("error", "Octave:broadcast"); 

để thay thế.

+0

+1 để thêm thông tin về khả năng tương thích với Matlab. –

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