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;
但该函数返回一个新结构。它不会改变我的输入结构。 我的错误在哪里?
答案 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