Matlab中实现数据共享

背景描述:
自定义了一个类,在类方法中需要缓存数据,以供其他方法或者实例共享数据,但是类的属性properties没有Static特性

解决方案:
方法一: 把需要共享的数据封装在一个单独的类里

% SharedData.m
classdef SharedData < handle  % 注意要加上 < handle
    properties
        SharedMatrix1 = []; 
        SharedMatrix2 = []; 
        SharedMatrix3 = [];
        AllData = [];
    end
end
% TestStatic.m
classdef TestStatic < handle  % 注意要加上 < handle
    properties
        InputData
        label
        DataObj
    end

    methods
        function obj = TestStatic(data, num, otherObj)
            % 构造函数: 初始化属性
            obj.InputData = data;
            obj.label = num;
            obj.DataObj = otherObj;
           
        end

        function process1(obj)

            if obj.label == 0
                obj.DataObj.SharedMatrix1 = [obj.DataObj.SharedMatrix1; obj.InputData];
            elseif obj.label == 1
                obj.DataObj.SharedMatrix2 = [obj.DataObj.SharedMatrix2; obj.InputData];
            else
                obj.DataObj.SharedMatrix3 = [obj.DataObj.SharedMatrix3; obj.InputData];
                process2(obj);
            end

        end

        function process2(obj)
            
            obj.DataObj.AllData = [obj.DataObj.SharedMatrix1; obj.DataObj.SharedMatrix2; obj.DataObj.SharedMatrix3];

        end
    end
end
% main.m
clear,clc,close all

% 创建共享数据对象,只创建了一次
sharedData = SharedData();

TestStaticobj1 = TestStatic([1, 2, 3], 0, sharedData);
TestStaticobj1.process1();
disp(sharedData.SharedMatrix1);
disp(sharedData.SharedMatrix2);
disp(sharedData.SharedMatrix3);
disp(sharedData.AllData);

TestStaticobj2 = TestStatic([4, 5, 6], 1, sharedData);
TestStaticobj2.process1();
disp(sharedData.SharedMatrix1);
disp(sharedData.SharedMatrix2);
disp(sharedData.SharedMatrix3);
disp(sharedData.AllData);

TestStaticobj3 = TestStatic([7, 8, 9], 2, sharedData);
TestStaticobj3.process1();
disp(sharedData.SharedMatrix1);
disp(sharedData.SharedMatrix2);
disp(sharedData.SharedMatrix3);
disp(sharedData.AllData);

方法二: 使用单例模式

% TestStatic2.m
classdef TestStatic2 < handle
    properties
        InputData
        label        
    end

    properties             
        % 存放共享数据
        SharedMatrix1 = []; 
        SharedMatrix2 = []; 
        SharedMatrix3 = [];
        AllData = [];
    end

    methods (Static)
        function obj = getInstance()
            % 创建静态变量
            persistent instance;
            if isempty(instance)
                instance = TestStatic2();
            end
            obj = instance;
        end
    end
    
    methods
        function obj = TestStatic2()
            % 构造函数: 初始化属性
            obj.InputData = [];
            obj.label = 0;            
        end

        function SetData(obj, data, num)
            obj.InputData = data;
            obj.label = num;            
        end

        function process1(obj)

            if obj.label == 0
                obj.SharedMatrix1 = [obj.SharedMatrix1; obj.InputData];
            elseif obj.label == 1
                obj.SharedMatrix2 = [obj.SharedMatrix2; obj.InputData];
            else
                obj.SharedMatrix3 = [obj.SharedMatrix3; obj.InputData];
                process2(obj);
            end

        end

        function process2(obj)           
            obj.AllData = [obj.SharedMatrix1; obj.SharedMatrix2; obj.SharedMatrix3];
            
            % 重置共享数据内存
            obj.SharedMatrix1 = [];
            obj.SharedMatrix2 = [];
            obj.SharedMatrix3 = [];

        end
    end
end
% main.m
clear,clc,close all

% 在 MATLAB 中,单例模式的实例在默认情况下会保持状态,即使你重新运行脚本或函数
% 为保证每次运行时是新的实例对象,需要清除类实例
clear TestStatic2

%% 单例模式
singleobj1 = TestStatic2.getInstance();
singleobj1.SetData([1, 2, 3], 0);
singleobj1.process1();
disp(singleobj1.SharedMatrix1);
disp(singleobj1.SharedMatrix2);
disp(singleobj1.SharedMatrix3);
disp(singleobj1.AllData);

singleobj2 = TestStatic2.getInstance();
singleobj2.SetData([4, 5, 6], 1);
singleobj2.process1();
disp(singleobj2.SharedMatrix1);
disp(singleobj2.SharedMatrix2);
disp(singleobj2.SharedMatrix3);
disp(singleobj2.AllData);

singleobj3 = TestStatic2.getInstance();
singleobj3.SetData([7, 8, 9], 2);
singleobj3.process1();
disp(singleobj3.SharedMatrix1);
disp(singleobj3.SharedMatrix2);
disp(singleobj3.SharedMatrix3);
disp(singleobj3.AllData);

singleobj4 = TestStatic2.getInstance();
singleobj4.SetData([10, 11, 12], 0);
singleobj4.process1();
disp(singleobj4.SharedMatrix1);
disp(singleobj4.SharedMatrix2);
disp(singleobj4.SharedMatrix3);
disp(singleobj4.AllData);

singleobj5 = TestStatic2.getInstance();
singleobj5.SetData([13, 14, 15], 1);
singleobj5.process1();
disp(singleobj5.SharedMatrix1);
disp(singleobj5.SharedMatrix2);
disp(singleobj5.SharedMatrix3);
disp(singleobj5.AllData);

singleobj6 = TestStatic2.getInstance();
singleobj6.SetData([16, 17, 18], 2);
singleobj6.process1();
disp(singleobj6.SharedMatrix1);
disp(singleobj6.SharedMatrix2);
disp(singleobj6.SharedMatrix3);
disp(singleobj6.AllData);

方法三: 全局变量

% GlobalVars.m
global Matrix1;
global Matrix2;
global Matrix3;
global Data;

Matrix1 = []; 
Matrix2 = []; 
Matrix3 = [];
Data = [];
% TestStatic3.m
classdef TestStatic3   % 可以不用 < handle
    properties
        InputData
        label       
    end

    methods
        function obj = TestStatic3(data, num)
            % 构造函数: 初始化属性
            obj.InputData = data;
            obj.label = num;            
        end

        function process1(obj)
            global Matrix1;
            global Matrix2;
            global Matrix3;

            if obj.label == 0
                Matrix1 = [Matrix1; obj.InputData];
            elseif obj.label == 1
                Matrix2 = [Matrix2; obj.InputData];
            else
                Matrix3 = [Matrix3; obj.InputData];
                process2(obj);
            end

        end

        function process2(obj)
            global Matrix1;
            global Matrix2;
            global Matrix3;
            global Data;

            Data = [Data; Matrix1; Matrix2; Matrix3];

            Matrix1 = []; 
            Matrix2 = []; 
            Matrix3 = [];

        end
    end
end
% main.m
clear,clc,close all

%% 全局变量
clear global;  % 清空全局变量
run('GlobalVars.m');  % 引入全局变量

singleobj1 = TestStatic3([1, 2, 3], 0);
singleobj1.process1();
disp(Matrix1);
disp(Matrix2);
disp(Matrix3);
disp(Data);

singleobj2 = TestStatic3([4, 5, 6], 1);
singleobj2.process1();
disp(Matrix1);
disp(Matrix2);
disp(Matrix3);
disp(Data);

singleobj3 = TestStatic3([7, 8, 9], 2);
singleobj3.process1();
disp(Matrix1);
disp(Matrix2);
disp(Matrix3);
disp(Data);

singleobj4 = TestStatic3([10, 11, 12], 0);
singleobj4.process1();
disp(Matrix1);
disp(Matrix2);
disp(Matrix3);
disp(Data);

singleobj5 = TestStatic3([13, 14, 15], 1);
singleobj5.process1();
disp(Matrix1);
disp(Matrix2);
disp(Matrix3);
disp(Data);

singleobj6 = TestStatic3([16, 17, 18], 2);
singleobj6.process1();
disp(Matrix1);
disp(Matrix2);
disp(Matrix3);
disp(Data);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值