2017-06-22 16 views
7

Chào buổi sáng/chiều/tối,Tích hợp một chức năng không trực tiếp vận hành phần tử khôn ngoan

Tôi đang làm việc trên tập lệnh Matlab liên quan đến tích lũy khối lượng thứ tự tính toán. Gọi H (r, theta, phi) là hàm tôi muốn tích hợp. Giả sử rằng H không thể thu được bằng các phép toán đơn giản trên r, theta và phi.

Vấn đề của tôi là trong Matlab như trong bất kỳ mã khác mà tôi biết:

All input functions must accept arrays and operate elementwise. The function FUN(X,Y,Z) 
must accept arrays X, Y, Z of the same size and return an array of corresponding values. 

Đây là từ việc thực hiện các integral3 function từ Matlab.

Nếu tôi thử với chức năng đơn giản này:

fun = @(X,Y,Z) X.*Y.*Z 

Không có vấn đề gì cả và nếu tôi tích hợp nó trên [0,1] x [0,1] x [0,1], tôi có được kết quả đúng:

integral3(fun,0,1,0,1,0,1) 

trả về 0.125 đúng.

Vấn đề là như tôi đã nói, tôi không thể thực hiện các phép tính đơn giản với các vectơ để có được H và tôi buộc phải làm những điều ít nhiều theo cách này:

function [result] = fun(x,y,z) 
    sz = length(x); 
    result = zeros(1,sz); 
    for i=1:sz 
     result(i) = x(i)*y(i)*z(i); 
    end 
end 

Chức năng này hoạt động trên nó sở hữu và trả về chính xác kết quả tương tự như kết quả tôi đã giới thiệu trước đó. Tuy nhiên, khi tôi cố gắng sử dụng integral3 tôi nhận được lỗi này:

Error using integral2Calc>integral2t/tensor (line 241) 
Integrand output size does not match the input size 

Nhưng nó rõ ràng có thể được nhìn thấy từ định nghĩa của chức năng của tôi mà tôi đặc biệt đã làm cho nó kích thước của đầu vào.

Tôi không hiểu điều gì sai và tôi không chắc mình có giải pháp nào khác để tính toán chức năng này hay không bằng cách sử dụng loại cú pháp này.

Cảm ơn rất nhiều thời gian của bạn và giúp :)

+1

Không có gì để thêm vào câu trả lời của @drhagen nhưng tôi chỉ muốn cảm ơn bạn vì câu hỏi được viết đẹp mắt này! – Toghe

Trả lời

4

Bạn đang đi đúng hướng, nhưng bạn đang xây dựng một mảng với chiều dài đúng nhưng kích thước sai. Đó là một sự khác biệt tinh tế trong Matlab. Tôi đoán rằng integral3 là đi qua trong một vector cột, nhưng chức năng của bạn luôn luôn trả về một vector hàng. Các vectơ cột và hàng có cùng "độ dài" sz nhưng khác "kích thước": vector cột là [sz,1] và vectơ hàng là [1,sz]. Đoạn code dưới đây làm những gì bạn muốn vì nó sử dụng size để đảm bảo rằng tất cả các kích thước của đầu ra phù hợp với đầu vào và numel để lặp qua các yếu tố cá nhân:

function result = fun(x,y,z) 
    sz = size(x); 
    result = zeros(sz); 
    for i = 1:numel(x) 
     result(i) = x(i)*y(i)*z(i); 
    end 
end 

Một nguyên tắc-of-thumb tốt là chỉ sử dụng sizenumel và không bao giờ sử dụng length, là ứng cử viên cho chức năng tồi tệ nhất trong Matlab.

+0

Được bình chọn cho lời khuyên về 'length'! –

+0

@drhagen Nó hoạt động khi tôi sử dụng 'size' và một vòng lặp kép trên' size (1) 'và' size (2) 'chỉ trong trường hợp hàm' integral3' sử dụng một mảng thay vì một cột hoặc một vector hàng, cảm ơn bạn ! Ngoài ra, cảm ơn bạn đã tư vấn về độ dài! –

+0

@JeremyDiallo Trên thực tế, do lập chỉ mục tuyến tính, phiên bản của tôi sẽ hoạt động nếu được cung cấp với một mảng, ngay cả khi mảng của nó là 2D, 3D, 4D, v.v. – drhagen

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