gpt4 book ai didi

wolfram-mathematica - Set::setps:在赋值部分中不是一个符号。 >>

转载 作者:行者123 更新时间:2023-12-02 12:12:37 26 4
gpt4 key购买 nike

我在 Mathematica 中定义一个函数,其中如果列表中的第 i 个值为 1,并且第 i+1 个值为 0,则该函数会切换这两个值。

我将其定义为:

f[i_, x_] := (If[x[[i]] == 1 && x[[i + 1]] == 0, x[[i]] = 1; x[[i + 1]] = 0]);

但是,当我使用 i = 2x = {1,1,0,0} 测试它时,出现以下错误:

Set::setps: {1,1,0,0} in the part assignment is not a symbol. >>

我不太知道我做错了什么,因为我认为我调用的一切都是正确的。

最佳答案

您似乎已经找到了解决方案,但无论如何我们还是要分解一下。

首先,您会遇到一个简单的转录错误,其中您的Set应用原始值而不是交换它们。通过此更改,基本代码可以工作:

i = 2;
x = {1, 1, 0, 0};

If[
x[[i]] == 1 && x[[i + 1]] == 0,
x[[i]] = 0; x[[i + 1]] = 1;
]

x
{1, 0, 1, 0}

所以我们已经成功更改了x。要使其成为函数,我们必须将 x名称传递给此代码,而不是 x 。这是您错误的根源:

{1, 1, 0, 0}[[2]] = 0;

Set::setps: {1,1,0,0} in the part assignment is not a symbol. >>

您需要的是函数的 Hold 属性:

SetAttributes[f, HoldAll]

f[i_, x_] := If[x[[i]] == 1 && x[[i + 1]] == 0, x[[i]] = 0; x[[i + 1]] = 1;]

i = 2 ;
x = {1, 1, 0, 0};

f[2, x]

x
{1, 0, 1, 0}

也许您并不打算更改 x 本身的值,但这种技术肯定会在其他应用程序中派上用场。要修改上面的函数来操作数据的副本,我们可以使用模块,并且不需要 Hold 属性:

f2[i_, xImmutable_] :=
Module[{x = xImmutable},
If[x[[i]] == 1 && x[[i + 1]] == 0, x[[i]] = 0; x[[i + 1]] = 1];
x
]

i = 2 ;
x = {1, 1, 0, 0};

f2[2, x]
{1, 0, 1, 0}

请注意,Module 中的 x 是局部变量,而不是全局列表 x,它保持不变。

为了好玩,让我们以不同的方式实现它。

f3[i_, x_] := 
If[
x[[i + {0, 1}]] == {1, 0},
ReplacePart[x, {i -> 0, i + 1 -> 1}],
x
]

f3[2, x]
{1, 0, 1, 0}

关于wolfram-mathematica - Set::setps:在赋值部分中不是一个符号。 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12875913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com