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

时间:2017-10-18 08:16:51

标签: matlab struct matlab-deployment

s= struct('Hello',0,'World',0);
for i = 1: 5
     s_vec(i) = s;
end

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

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

但该函数返回一个新结构。它不会改变我的输入结构。 我的错误在哪里?

3 个答案:

答案 0 :(得分:2)

我不确定完全理解您的问题,但如果您想更新结构中的参数,则必须将结构作为函数的参数传递给更新。

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

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

以这种方式使用它:

s_vec = set_s(s_vec, 2, 'Hello', 5);

它会将第二个值更新为参数' Hello'到5。

答案 1 :(得分:1)

虽然我认为Romain的答案是更好的做法,但是如果你使用Nested Functions,你可以修改参数而不将它们传入和传出函数。

但是,我不喜欢使用它们,因为在复杂的大型函数中,尝试跟踪设置和修改内容时会非常困惑。

这里所说的是使用嵌套函数做你想做的事情的一个例子。

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

输出:

Pre-Nested Call
    Hello: 0
    World: 0

Post-Nested Call
    Hello: 1
    World: 0

答案 2 :(得分:-3)

如果要更改函数外的数据(也就是副作用),请使用类而不是结构。类必须是句柄。

classdef MutableStruct < handle
    properties
        field1;
        field2;
    end
    methods
        function this = MutableStruct(val1, val2)
            this.field1 = val1;
            this.field2 = val2;
        end
    end
end

有关正确初始化对象数组的更多信息: MATLAB: Construct Object Arrays