如何正确使用`block`功能
How to properly use the `block` function
我正在尝试编写一个小函数,它需要 2 个向量,更改第一个向量第一个条目的符号,然后对它们执行点积。但是,当我这样做时,函数中更改的向量的全局值在函数外部发生了更改。
我尝试使用 block
函数来保护向量的全局值,但这似乎没有任何改变。
a: matrix([3],[4],[5]);
b: matrix([4],[5],[6]);
f(x,y):=block([x:x,y:y],x[1]:-x[1],x.y);
f(a,b);
我希望答案是 38,这是我第一次 运行 f(a,b);
但是当我第二次这样做时,我得到 62 因为 a
有全局更改。
您将一个矩阵传递给该函数,并且该矩阵未被复制,它是对同一矩阵的引用。正如 Maxima 文档所说,
Matrices are handled with speed and memory-efficiency in mind. This means that assigning a matrix to a variable will create a reference to, not a copy of the matrix. If the matrix is modified all references to the matrix point to the modified object (See copymatrix for a way of avoiding this)
所以需要复制一个矩阵独立处理:
f(x,y):=block([x:x, y:y, m:m, n:n],
m:copymatrix(x),
n:copymatrix(y),
m[1]:-m[1],
m.n);
我正在尝试编写一个小函数,它需要 2 个向量,更改第一个向量第一个条目的符号,然后对它们执行点积。但是,当我这样做时,函数中更改的向量的全局值在函数外部发生了更改。
我尝试使用 block
函数来保护向量的全局值,但这似乎没有任何改变。
a: matrix([3],[4],[5]);
b: matrix([4],[5],[6]);
f(x,y):=block([x:x,y:y],x[1]:-x[1],x.y);
f(a,b);
我希望答案是 38,这是我第一次 运行 f(a,b);
但是当我第二次这样做时,我得到 62 因为 a
有全局更改。
您将一个矩阵传递给该函数,并且该矩阵未被复制,它是对同一矩阵的引用。正如 Maxima 文档所说,
Matrices are handled with speed and memory-efficiency in mind. This means that assigning a matrix to a variable will create a reference to, not a copy of the matrix. If the matrix is modified all references to the matrix point to the modified object (See copymatrix for a way of avoiding this)
所以需要复制一个矩阵独立处理:
f(x,y):=block([x:x, y:y, m:m, n:n],
m:copymatrix(x),
n:copymatrix(y),
m[1]:-m[1],
m.n);