2012-01-24 30 views
6

Tôi có tệp mex (được biên dịch trong VS2010, Matlab 2010b) chấp nhận biến và thay đổi. Ví dụ, trong file mex nó trông giống như:Biến Matlab hiển thị hành vi 'giống như tham chiếu' khi được sao chép và chuyển đến tệp mex

double *fp = (double *)mxGetPr (prhs[0]); 
*fp = someDoubleValue; 

Để so sánh việc thực hiện Matlab và việc thực hiện mex, tôi tạo một bản sao của biến trước khi gọi file mex:

var_mex = var; 
mymex (var_mex); 

Trước sự ngạc nhiên của tôi, cả hai var_mexvar thay đổi (với cùng giá trị của khóa học), như thể tôi đã tạo một tham chiếu đến var chứ không phải bản sao của nó.

Đây có phải là sự cố đã biết không? Làm thế nào tôi có thể thuyết phục Matlab sao chép biến?

EDIT

Kể từ khi tôi nghi ngờ rằng vấn đề này là kết quả của Matlab tối ưu hóa quản lý bộ nhớ của nó, tôi đã làm một số "không làm gì cả" tính trên var trước khi gọi file mex, tức là

var=var+1; 
var=var-1; 

và thực sự nó giải quyết được vấn đề. Tôi vẫn sẽ vui mừng nhận được một số thông tin (hoặc các đề xuất khác) về điều này, nếu ai đó gặp phải nó là tốt.

+2

Dường như theo thiết kế đi theo [trang này] (http://www.mit.edu/~pwb/matlab/). Có lẽ bạn có thể sửa đổi var_mex trước khi truyền nó vào như nhân nó với 1. Hoặc thêm 1 rồi trừ 1 trong hai bước rời rạc. – tinman

+0

có, đó chính xác là những gì tôi đã thử (và nó hoạt động, xem bản chỉnh sửa của tôi). –

+2

Bạn đã đọc tài liệu Matlab về [quản lý bộ nhớ của Matlab] chưa (http://www.mathworks.co.uk/help/techdoc/matlab_prog/brh72ex-2.html)? Nó giải thích hành vi này. – tinman

Trả lời

7

Trong MATLAB, hầu hết các biến được chuyển khoảng như thể chúng đang được chuyển theo giá trị. Ngoại lệ đáng chú ý cho điều này là các trường hợp của các lớp được kế thừa từ handle được chuyển một cách rõ ràng bằng tham chiếu.

Có một số blog entry here, một số chi tiết về điều này.

Vì vậy, khi bạn thực hiện

var_mex = var; 

Bạn kết thúc với var_mex đề cập đến các dữ liệu giống như var.

Khi bạn đang viết thư cho một mxArray bên trong chức năng mex, bạn có khả năng phá vỡ mọi thứ vì bạn được cung cấp địa chỉ cơ bản của dữ liệu. Nếu bạn sửa đổi một phần tử của mảng prhs, bạn có thể vô tình kết thúc việc sửa đổi các biến khác chia sẻ cùng một dữ liệu. Vì vậy, đừng làm thế. Trong thực tế, các mex doc một cách rõ ràng nói với bạn không làm điều đó.

Lý do thủ thuật var + 1 hoạt động là bằng cách sửa đổi dữ liệu, bạn buộc MATLAB tạo bản sao dữ liệu.

+1

"Vì vậy, không làm điều đó. Trong thực tế, các mex doc rõ ràng nói với bạn không làm điều đó" +1 :) – Jonas

+0

Có một lý do cụ thể cơ chế mex không ngăn cản bạn thay đổi các biến đầu vào? –

+0

Vâng, giao diện mex chỉ định rằng các con trỏ prhs là const. Cách duy nhất khả thi là giao diện mex có thể đảm bảo rằng bạn không gây ra các thay đổi có thể nhìn thấy đối với các prh sẽ là nếu chúng được nhân đôi trên đường vào hàm mex - điều này sẽ rất không hiệu quả. – Edric

0

Tất cả các biến trong Matlab được chuyển theo giá trị.

Thực hiện bất kỳ thay đổi trực tiếp nào đối với các đối số rhs trong mexfunction Matlab không được hỗ trợ chính thức. Nếu bạn đang chuyển đổi một chức năng Matlab của biểu mẫu A = func(A), thì bạn "bắt buộc" để tạo bản sao của mảng đã vượt qua A bên trong chính mexfunction.

+4

Trong chính ngôn ngữ MATLAB, các biến được chuyển * như thể theo giá trị * bằng cách sử dụng ngữ nghĩa sao chép trên ghi. Điều này giải thích tại sao thêm các phép cộng/trừ 'sửa' - giá trị được sửa đổi và do đó phải sao chép. Một khi bạn đang ở trong thế giới của các tập tin MEX - bạn đang ở trên của riêng bạn, và có thể phá vỡ quản lý bộ nhớ tiêu chuẩn của MATLAB đến một mức độ nào đó. – Edric

+2

@Edric: Tại sao bạn không mở rộng nhận xét thành câu trả lời? – Jonas

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