4

で使用できる演算子を使用しMATLABたシンボリック式があります。私が欲しいのは、式の左側と右側を2つの別々のシンボリック式に分離することです。==solve()

例えば:

expr = sym('[1-x^2==2*y; 1+x^2==x+y]');
side1 = lhs(expr);        % returns side1 = [1-x^2; 1+x^2];

もちろん、私の表現ははるかに複雑で、常にベクトルまたは行列形式です。

回避策1MuPAD組み込み関数 を使用できますが、関数lhs()のみを使用してこれを実行できるかどうかを知りMATLABたいので、1つの値だけでなく、式のベクトルに対しても機能させたいと考えています。

これは私がこれまでに持っているものであり、期待どおりに機能します。たぶん、結果の塗りつぶしはを使用して何らかの形でベクトル化することができます:が、私はそれを機能させることができませんでした。

function [ r ] = lhs( expr )
%LHS Returns the left hand side an expression
%   LHS(sym('[1-x^2==2*y'; 1+x^2==x+y]')) = [1-x^2; 1+x^2]

  cmd = @(e)['lhs(',char(e),')'];
  [m,n] = size(expr);
  r = sym(zeros(m,n));
  for i=1:m
      for j=1:n
          r(i,j) = evalin(symengine, cmd(expr(i,j)));
      end
  end  
end
4

3 に答える 3

4

R2017a以降、「lhs」と「rhs」を次のように使用します

syms x
expr = [1-x^2==2*y; 1+x^2==x+y];
lhsExpr = lhs(expr)
lhsExpr =
 1 - x^2
 x^2 + 1


rhsExpr = rhs(expr)
rhsExpr =
  2*y
 x + y
于 2017-03-12T13:07:56.827 に答える
2
expr = sym('[1-x^2==2*y; 1+x^2==x+y]');
lr = children(expr);
lr{1}

ans =

[ 1 - x^2, 2*y]

これは、単純な理由でEitanTの文字列操作よりも堅牢であることに注意してください。左側と右側に等号が含まれている場合があります。

于 2013-03-15T16:06:56.857 に答える
0

正規表現を考えているので、これが私のショットです。

たとえば、シンボリック式があるexprとします。

expr = sym('[1-x^2==2*y; 1+x^2==x+y]')

スカラー式とは見なされないため、最初のステップでは、サブ要素に分割し、次のようにそれぞれを文字列に変換します。

C = arrayfun(@(n)char(expr(n)), 1:numel(expr), 'Uniform', false)

(構文が追加されるため、単純なchar(expr)変換は使用していません)。matrix([[...]])

ここで、正規表現の検索と置換を使用してLHSを抽出します。

C = arrayfun(@(n)char(expr(n)), 1:numel(expr), 'Uniform', false)
C = regexprep(C, '([^><=]*)(?:[><=]*)(.*)', '$1')  %// $1 for lhs, $2 for rhs

次に、要素を連結して文字列に戻し、それをシンボリック式に変換します。

str = sprintf('%s,', C{:})
result = reshape(sym(str(1:end - 1)), size(expr))

出来上がり。


コピーlhsアンドペーストに適したrhs機能は次のとおりです。

function y = lhs(x)
    C = arrayfun(@(n)char(x(n)), 1:numel(x), 'Uniform', false);
    C = regexprep(C, '([^><=]*)(?:[><=]*)(.*)', '$1');
    str = sprintf('%s,', C{:});
    y = reshape(sym(str(1:end - 1)), size(x));

function y = rhs(x)
    C = arrayfun(@(n)char(x(n)), 1:numel(x), 'Uniform', false);
    C = regexprep(C, '([^><=]*)(?:[><=]*)(.*)', '$2');
    str = sprintf('%s,', C{:});
    y = reshape(sym(str(1:end - 1)), size(x));

との唯一の違いは、の置き換えられたトークンであることに注意しlhsrhsくださいregexprep
を使用$1すると左側が抽出され、を使用$2すると右側が抽出されます。

于 2013-01-22T16:53:14.860 に答える