对象中的获取器和设置器

时间:2018-10-26 21:09:44

标签: matlab

我有一个名为TestData()的对象,该对象处理数据处理并将其以指定的格式放置在文件中。属性之一是data,它存储为double类型的数组。这是对象及其构造函数:

classdef TestData
properties
    metaData  = [];  % stores meta data in Nx2 array
    data      = [];  % stores data in PxQ array
    colLabels = [];  % labels columns
    colUnits  = [];  % provides units
    metaPrint % used to print metaData
    temp      % debugging purposes only
end

methods
    %****************************************************************************%
    %Function: TestData
    %Purpose:  Constructor used to allocate data arrays
    %****************************************************************************%
    function this = TestData() %constructor
        this.metaPrint  = [];
        this.temp       = [];
    end %TestData()     

放置到对象中的数据来自对象外部的.m文件,如下所示:

myTestData=TestData; % Generate an instance of the object

% Data
ErrorLine1 = zeros([length(ErrorLine')+2 1]); % Empty Vector to store 11X1 
ErrorLine data
ErrorLine1(2:end-1) = ErrorLine(1:end);
mat = [Avec' Bvec' Invec' Ovec' ErrorLine1 PercentErrorOD'];
myTestData.data = mat;    

因此,当我设置myTestData.data = mat时,会将数据放置在对象中,然后调用该对象的getter和setter函数。使用这些功能的基本原因之一是过滤数据并确定它是否是正确的数据类型(在这种情况下,格式必须为double)。但是,当我在代码中尝试此操作时,它似乎不起作用。这是我为吸气剂写的:

    function data = get.data(this)
        data = this.data;
    end %getData

和二传手:

    function this = set.data(this, data)
        i = arrayfun(@(n)strcmp(class(this.data(n)), 'doube'), 1:numel(this.data)); %#ok<STISA>
        disp(i)
        if any(i == 0)
            disp("WE HAVE A ZERO")
            msg = "Data in object's 'data' property is not of type double";
            error(msg);

        else
            this.data = data;
            disp('Hi from setter')
        end
    end % set.data 

如果我通过命令窗口运行strcmpany功能,它将起作用!但是,当我从编辑器运行它时,即使我在比较中将“ double”更改为“ string”,它也始终显示“ Hi from setter”字符串。因此,我只是不确定为什么不输入if语句。

如果您可以在我的代码中看到任何可以修改以提高效率的内容,请告诉我。此外,如果还有其他事情,我会尽力而为。预先感谢!

1 个答案:

答案 0 :(得分:1)

在设置者中,您有以下一行:

i = arrayfun(@(n)strcmp(class(this.data(n)), 'doube'), 1:numel(this.data));

但是请注意,您尚未完成this.data = data。测试this.data时,将测试属性的旧值,而不是要分配的值。您需要测试data

您可以对isa进行更好的测试,而不是对strcmp的结果使用class。此外,除非data是一个单元格数组或一个struct数组,否则每个元素将始终属于同一类。您不需要遍历整个数组来测试其类型,只需查看数组本身的类型即可。对于单元格数组和struct数组,索引必须不同才能提取元素。因此,data(n)将始终与data具有相同的类型。因此,您的二传手可以写为:

function this = set.data(this, data)
   if ~isa(data,'double')
      error('WRONG!')
   end
   this.data = data;
end

另一个与代码有关的问题:if any(i == 0)any折叠输入数组的一维。因此,如果i是2D矩阵,则输出是行向量。如果给定列中的任何元素为true,则每个元素均为true。仅当给定表达式的所有元素都不为零时,if语句才为true。这意味着所有列必须至少具有一个0值,此表达式才能触发。

相反,请执行if any(i(:)==0)。在这里,我们将i设为列向量(这不会复制数据,效率很高),因此any将返回单个(标量)值。如果您具有MATLAB R2018b,则也可以执行if any(i,'all'),这是等效的。

您经常会看到代码在执行if any(any(i==0)),但是如果i恰好具有三个或更多个维度,则此操作将失败。效率也不高,上面的表格更好。