如何在 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
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