0

我基于来自数据的变量列表创建了一个类。我做了一个函数,将所有数据放在这个类的一个对象中。

随着变量列表的增长,我不得不不断调整类和加载函数。我正在尝试找到一种方法,使我的加载功能对类中的更改具有鲁棒性。

类文件的代码:

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 中有没有办法使用保存字符串的变量作为输入来加载以字符串内容命名的变量的值?

这是否可能在“=”符号之前命名内容在“=”符号之后引用变量是否可能

4

2 回答 2

3

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

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

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

现在,子类化的真正好处hgsetget您还可以将 astruct属性/值传递给setand get

例子

classdef CoolClass < hgsetget
    properties
        prop_a
        prop_b
    end
end

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

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

    prop_a: 1
    prop_b: 2

set(cls, data)

如果您的变量data.mat不是的类的属性,您可以轻松地将它们过滤掉并仍然使用set.

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

一个更好的例子

我个人会做的是编写一个构造函数,它接受与set(即结构或参数/值对)相同的输入,然后在构造函数内部,将它们直接传递给set. 此外,您可以 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

现在,您可以使用与以前不同的两种其他方式来使用此类。

cls = CoolClass(load('data.mat'));
cls = CoolClass.loadobj(load('data.mat'));
于 2016-03-15T13:53:47.330 回答
-3

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

于 2016-03-15T13:30:44.967 回答