0

そのため、このエラーの原因を突き止めるために周りを見回しましたが、関数のディレクトリパスがわからないmatlabが原因であると人々がリストし続けています。私はチェックしましたが、matlabはパスを知っているので、それは問題ではないようです。ガウス消去を行うと思われるコードがいくつかあります

classdef gaussfunctions
    %UNTITLED Summary of this class goes here
    %   Detailed explanation goes here

properties
end

methods (Static)
    function solution_vec = gauss_reduce(param_mat, const_vec)
        %check for conistent sixe of param_mat and const_vec
        [n,m] = size(param_mat);

        if n ~= m | n ~= size(const_vec)
            disp('Non square matrix or constant vector was incorrect size');
            solution_vec = zeros(size(const_vec));
            return

        end

        %reduce coeffeicient matrix to upper triangular
        [ut_mat, new_const_vec] = ut_reduce(param_mat, const_vec);

        %compute the solution vector
        solution_vec = back_subst(ut_mat, new_const_vec);
    end

    function [ut_mat, new_const_vec] = ut_reduce(param_mat, const_vec)
        %get the size of the parameter matrix
        [m,n] = size(param_mat);

        %get the values of the arguments to change and the return
        cur_mat = param_mat;
        cur_vec = const_vec;

        %loop through all of the columns to reduce them
        for cur_col = 1:m,
            [cur_mat, cur_vec] = reduce_column(cur_mat, cur_vec, cur_col);
        end

        %return the values
        ut_mat = cur_mat;
        new_const_vec = cur_vec;

    end

    function [new_mat, new_const_vec] = reduce_column(param_mat, const_vec, column)
        %get the size 
        [m,n] = size(param_mat);

        %copy the argument values to change them and the return
        cur_mat = param_mat;
        cur_vec = const_vec;

        %check to see if the pivot is zero or not
        if param_mat(column,column) == 0

            disp('Zero pivot encourtered');
            new_mat = param_mat;
            new_const_vec = zeros(size(const_vec));

            return
        end

        %loops down calling reduce_row_at_col on all row below the
        %current column
        for i = column + 1:n,
            [cur_mat, cur_vec] = reduce_row_at_col(cur_mat, cur_vec, column, column, i);
        end

        %return the end values
        new_mat = cur_mat;
        new_const_vec = cur_vec;

    end


    function [new_mat, new_const_vec] = reduce_row_at_col(param_mat, const_vec, col, row_added, row_reduced)
        %transfer over the values
        new_mat = param_mat;
        new_const_vec = const_vec;

        %get the multiple that will be multiplied by the row that will
        %be added
        m = (-param_mat(row_reduced,col))/param_mat(row_added, col);

        %change the value of the new_mat at the row that's going to be reduced 
        new_mat(row_reduced,col) = param_mat(row_reduced,col) + m*param_mat(row_added,col);

        %change the value of the new_const_vec at the row that's going
        %to be reduced
        new_const_vec(row_reduced) = const_vec(row_reduced) + m*const_vec(row_reduced);

    end

    function solution_vec = back_subst(ut_mat, new_const_vec)
        %get the size of the matrix
        [n,m] = size(ut_mat);
        %set the partial soltuions to zeroes
        part_solution_vec = zeros(new_const_vec);

        %start from the last column and work backwards
        for i = n: -1: 1,
            part_solution_vec = back_subst_for_col(ut_mat, new_const_vec, i, part_solution_vec);
        end

        %return the final answer
        solution_vec = part_solution_vec;

    end

    function new_part_solution_vec = back_subst_for_col(ut_mat, new_const_vec, column, part_solution_vec)
        %get size
        [n,m] = size(ut_mat);
        %value used for calculation
        subst_val;
        %copy over the partial solution
        new_part_solution_vec = part_solution_vec;

        %if we are at the last element then we want to do a simplified
        %calculation
        if column == n
            new_part_solution_vec(column) = new_const_vec(column)/ut_mat(column,column);
            return
        end

        %otherwise calculate the soltuion through back substituion
        for i = column + 1: n,
            subst_val = subst_val + ut_mat(column,i)*part_solution_vec(i);
        end

        %do the final calculation
        new_part_solution_vec(column) = (new_const_vec(column) - subst_val)/ut_mat(column,column);

    end

end

終わり

問題は、関数を呼び出すことができることですが、ヘルパー関数を呼び出すとエラーになります。gauss_reduce()コマンド ウィンドウで呼び出す例を次に示します。

gaussfunctions.gauss_reduce(A,B)
??? Undefined function or method 'ut_reduce' for input arguments of type 'double'.

Error in ==> gaussfunctions>gaussfunctions.gauss_reduce at 21
            [ut_mat, new_const_vec] = ut_reduce(param_mat, const_vec);

すべてを 1 つのクラスにまとめることと関係がありますか? 私は以前に matlab でプログラミングしたことがないので、かなり明白なエラーである場合は許してください。しかし、何が起こっているのかわかりません。

4

1 に答える 1

2

MATLAB は、すべてのメソッドに特別な隠しクラス インスタンスが渡されないという点で、C++ や Java® などの言語とは異なります。クラスのオブジェクトをメソッドに明示的に渡す必要があります。一番左の引数はクラス インスタンスである必要はなく、引数リストには複数のオブジェクトを含めることができます。

http://www.mathworks.com/help/matlab/matlab_oop/specifying-methods-and-functions.htmlから

また:

classdef ファイル内のローカル関数は、そのファイル内でのみ使用するユーティリティ関数に役立ちます。これらの関数は、クラスのインスタンスである引数を取得または返すことができますが、通常のメソッドの場合のように必須ではありません。たとえば、次のコードは、classdef ブロックの外側で myUtilityFcn を定義します。

これが言っていることはend、ユーティリティ関数の前に an を置くと、それは classdef の _outside になり、すべてがうまくいくということです。それはファイルにありますが、クラスの外にあります。したがって、それは世界から「隠されています」(クラス定義を超えて見えません)が、クラスはそれを使用できます:

  % ... earlier code ...
        %compute the solution vector
        solution_vec = back_subst(ut_mat, new_const_vec);
    end
end  % <<<< add this one

function [ut_mat, new_const_vec] = ut_reduce(param_mat, const_vec)

%....
end
end % <<<<<< remove the last end statement
于 2013-12-11T23:44:53.850 に答える