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);
原文地址:https://blog.csdn.net/Doreenqiuyue/article/details/142587244
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!