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

How to change the Value of a struct with a function in Matlab?

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;

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

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

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

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

此外,如果 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。

尽管我认为 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