Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中忽略数学优先级_Matlab_Operator Precedence - Fatal编程技术网

在MATLAB中忽略数学优先级

在MATLAB中忽略数学优先级,matlab,operator-precedence,Matlab,Operator Precedence,有人知道如何让MATLAB接受字符串吗 f(x)=3*x+5*(2+100),其中x=5 但忽略所有优先规则(包括括号),只从左到右计算。 因此,上述问题的答案将是140而不是525 我在想,这将是沿着 [s,r]=strtok(myString,'0123456789') 加入一个for循环,但我还没有弄清楚具体怎么做 请帮忙! 谢谢对于一个简单的表达,一种方法是: 去掉表达式中的所有括号 将数字和运算符分开 用括号重新生成表达式,构造严格的从左到右优先级 当然,在你的例子中,我们也首先要

有人知道如何让MATLAB接受字符串吗

f(x)=3*x+5*(2+100),其中x=5

但忽略所有优先规则(包括括号),只从左到右计算。 因此,上述问题的答案将是140而不是525

我在想,这将是沿着

[s,r]=strtok(myString,'0123456789')

加入一个for循环,但我还没有弄清楚具体怎么做

请帮忙!
谢谢

对于一个简单的表达,一种方法是:

  • 去掉表达式中的所有括号
  • 将数字和运算符分开
  • 用括号重新生成表达式,构造严格的从左到右优先级
当然,在你的例子中,我们也首先要处理“函数表达式”的情况。这意味着检测“变量”(
x
,在您的情况下),并检索它的值。因此,所提议的代码变得相当长,正因为如此

它适用于您的示例,对于不同的表达式应该可以,只要它们尊重相同的样式。在任何情况下,它只适用于一个变量的函数

您可能必须添加一些字符才能忽略。此时只会忽略括号
,但您可以添加括号
[]
以及表达式中可能包含且希望忽略的任何其他符号。(在“整理”一段中添加。)


注意:如果表达式包含函数(如
cos
sqrt
等),则该函数不起作用。但是,幂运算符
^
将起作用,其优先级也将被覆盖。

类似这样的操作将实现此目的

可通过以下方式调用:

StackExchange('f(x) = 3*x + 5*(2+100)', 'x = 5')
StackExchange('3*x + 5*(2+100)', 5)
或者两者的任意组合

function y = StackExchange(f, x)
operations = {'+', '-', '*', '/', '^'};
parenthesis = {'(', ')', '[', ']', '{', '}'};

if ~isnumeric(x)
    x = eval(strrep(strrep(x, 'x', ''), '=', ''));
end

f = strrep(strrep(f, 'f(x)', ''), '=', '');

for h = 1:numel(parenthesis)
    h1 = parenthesis{h};
    f = strrep(f, h1, '');
end

for h = 1:numel(operations)
    h1 = operations{h};

    a = strfind( f , h1);
    for i = length(a):-1:1 ;
        f = [f(1:a(i) - 1), ')', f(a(i):end)] ;
    end

    f = [repmat('(', 1, length(a)), f];
end

f = strrep(f, 'x', num2str(x));
y = eval(f);

end

因此,
*
优先于
+
也应该忽略?是的,必须严格地从左到右进行评估所需的输出“s”和“r”究竟是什么?s用于运算符(例如“+”或“-”),r用于字符串的其余部分。然而,我已经得到了答案。非常感谢。谢谢,我本来会投票支持你的解决方案的,但是我没有足够的分数。我真的很感谢你的帮助,谢谢你,又好又干净的解决方案。重新组织括号确实是一种非常有趣的方法。
function y = StackExchange(f, x)
operations = {'+', '-', '*', '/', '^'};
parenthesis = {'(', ')', '[', ']', '{', '}'};

if ~isnumeric(x)
    x = eval(strrep(strrep(x, 'x', ''), '=', ''));
end

f = strrep(strrep(f, 'f(x)', ''), '=', '');

for h = 1:numel(parenthesis)
    h1 = parenthesis{h};
    f = strrep(f, h1, '');
end

for h = 1:numel(operations)
    h1 = operations{h};

    a = strfind( f , h1);
    for i = length(a):-1:1 ;
        f = [f(1:a(i) - 1), ')', f(a(i):end)] ;
    end

    f = [repmat('(', 1, length(a)), f];
end

f = strrep(f, 'x', num2str(x));
y = eval(f);

end