在 Matlab 中迭代 class 个属性

Itererating over class properties in Matlab

我根据来自数据的变量列表创建了一个 class。我创建了一个函数,它将所有数据放入此 class.

的对象中

随着变量列表的增长,我不得不不断调整 class 和加载函数。我正在尝试找到一种方法,使我的加载函数能够抵抗 class.

中的变化

Class 文件的代码:

classdef CoolClass
    properties
        prop_a
        prop_b
        prop_c
    end
end

我编写的将此数据加载到对象中的函数:

function [ object_name ] = loadCoolClass (data_file_name)

    load(data_file_name) 
    % this loads the variabels: 
    % prop_a = 1, prop_b = 2, prop_c = 3, prop_d = 4

    object_name = CoolClass;

    object_name.prop_a = prop_a;
    object_name.prop_b = prop_b;
    object_name.prop_c = prop_c;
end

现在我想要的是,如果我将变量 prop_d 添加到 classdef 文件,它也会立即将其加载到加载文件中。像这样:

function [ object_name ] = loadCoolClass (data_file_name)

    load(data_file_name) 
    % this loads the variabels: 
    % prop_a = 1, prop_b = 2, prop_c = 3, prop_d = 4

    object_name = CoolClass
    cool_properties = properties(CoolClass)

    for i = 1:size(cool_properties,2)
        object_name.cool_property(i) = cool_property(i)
    end
end

现在我知道上面的循环不是有效代码,但我的意思是:检查每个 属性 是否存在具有该名称的变量并将其放入对象中。

在matlab中有没有办法使用一个保存字符串的变量作为输入来加载以字符串内容命名的变量的值?

在'='符号之前命名内容是否可行 在“=”符号

之后引用变量是否可能

我不知道你正在尝试做的事情是否有意义,但我认为你正在寻找函数 eval: object_name.cool_property(i) = eval(cool_property(i))

根据我的经验,最简单 的方法是让您的 class 成为 hgsetget 的子class。这使您能够像使用图形对象一样使用 set(obj, 'Key', value)get(obj, 'Key', value)

cls = CoolClass();
set(cls, 'prop_a', 1)

第二步是 specify an output to load(而不是仅仅将数据转储到您的工作区),这将为您提供一个结构,其中包含文件中每个变量的字段。建议从文件加载 以保持工作区整洁。

现在,subclassing hgsetget 真正的 好处是 you can also pass a struct of property/valuessetget!

例子

classdef CoolClass < hgsetget
    properties
        prop_a
        prop_b
    end
end

现在,如果您有一个包含 prop_aprop_b 值的文件 data.mat,您就可以执行此操作。

cls = CoolClass();
data = load('data.mat')

    prop_a: 1
    prop_b: 2

set(cls, data)

如果 data.mat 中的变量 不是 class 的 属性,您可以轻松过滤掉这些变量并仍然使用 set .

toremove = setdiff(fieldnames(data), props);
set(cls, rmfield(data, toremove);

一个更好的例子

我个人会做的是编写一个构造函数,它接受与 set 相同的输入(即结构或 param/value 对),然后在构造函数内部,将它们直接传递给set。此外,您可以为 class 实现一个 loadobj 方法,它本质上是一个接受结构作为输入的静态方法。您可以在该方法中执行所有验证以删除不需要的字段。

classdef CoolClass < hgsetget
    properties
        prop_a
        prop_b
    end

    methods
        function self = CoolClass(varargin)
            set(self, varargin{:});
        end
    end

    methods (Static)
        function obj = loadobj(S)
            obj = CoolClass();

            % Remove any invalid fields
            toremove = setdiff(fieldnames(S), properties(cls));
            set(obj, rmfield(S, toremmove))
        end
    end
end

现在您可以使用此 class 不同于我们以前的两种其他方式。

cls = CoolClass(load('data.mat'));
cls = CoolClass.loadobj(load('data.mat'));