如何在Matlab中使用函数更改结构的值?

如何在Matlab中使用函数更改结构的值?,matlab,struct,matlab-deployment,Matlab,Struct,Matlab Deployment,我在一个脚本中定义了一个Matlab结构。现在我想实现一个函数,改变参数的值。 例如: s= struct('Hello',0,'World',0); for i = 1: 5 s_vec(i) = s; end 但是函数返回一个新的结构。它不会更改我的输入结构。 我的错误在哪里?如果您希望在函数之外更改数据(也称为副作用),请使用类而不是结构。类必须是句柄 classdef MutableStruct

我在一个脚本中定义了一个Matlab结构。现在我想实现一个函数,改变参数的值。 例如:

s= struct('Hello',0,'World',0);
for i = 1: 5
     s_vec(i) = s;
end
但是函数返回一个新的结构。它不会更改我的输入结构。
我的错误在哪里?

如果您希望在函数之外更改数据(也称为副作用),请使用类而不是结构。类必须是句柄

classdef MutableStruct
有关正确初始化对象数组的详细信息:
我不确定是否完全理解您的问题,但如果您想更新结构中的参数,必须将要更新的结构作为函数的参数传递

此外,如果prop是参数,则应在函数中使用字符串进行动态分配:

function s_struct = set_s (number, prop , value) 
         s_struct(number).prop = value;
以这种方式使用它:

function [ s_struct ] = set_s( s_struct, number, prop, value )
    s_struct(number).(prop) = value;
end

它会将参数“Hello”的第二个值更新为5。

虽然我认为Romain的答案是更好的做法,但如果您使用,您可以修改参数,而无需将其传入或传出函数

但是,我不喜欢使用它们,因为在复杂的大型函数中,试图跟踪设置和修改的位置可能会非常混乱

这里所说的是一个使用嵌套函数来完成所需操作的示例

s_vec = set_s(s_vec, 2, 'Hello', 5);
输出:

function nestedTest()
%Define your struct
s= struct('Hello',0,'World',0);
for i = 1: 5
    s_vec(i) = s;
end
disp('Pre-Nested Call')
disp(s_vec(1))
set_s(1, 'Hello' , 1);%Set the first element of s_vec without passing it in.
disp('Post-Nested Call')
disp(s_vec(1))

    function set_s (number, prop , value)
        % Nested can modify vars defined in parent
        s_vec(number).(prop) = value;
    end
end

什么?结构不是不变的。
s.data=1;显示(s.数据);s、 数据=2;显示(s.数据)看起来这确实改变了数据。您是否有任何文档/代码支持您的断言,即结构数组在MATLAB中是不可变的?您的原始结构不是
s_struct
的输入,您希望您的函数如何更改它?如果您使用嵌套函数而不传入或传出它们,您可以修改父函数中定义的变量。我在下面给出了一个示例答案。。。然而,我一般不喜欢这样写函数。
Pre-Nested Call
    Hello: 0
    World: 0

Post-Nested Call
    Hello: 1
    World: 0