在 Matlab 中自动命名和连接单独创建的字符串、数字和向量
Automate naming and concatenation of separately created strings, numbers and vectors in Matlab
我写了一个示例代码来说明我的问题 - 见下文。我有几个操作,每个操作都由不同的服务器独立执行(不仅是示例中的 4 个,而是更多)。我想...
1) 自动命名结果,这样我就可以为更多的年份、部分年份和植物类型命名(例如,当 Year = 2008,PartOfYear = 1 时,将变量命名为 "string200811" , PlantType = 1 等)
2) 也自动连接(如以下代码中的连接)。
如果有任何不清楚的地方,请告诉我!
% Operation 1
Year = 2008;
PartOfYear = 1;
PlantType = 1;
string200811 = 'blabla'; % some random result
number200811 = rand(1); % some other random result
vector200811 = [rand(1); rand(1); rand(1); rand(1)]; % some other random result
% Operation 2
Year = 2008;
PartOfYear = 1;
PlantType = 2;
string200812 = 'blablablubb';
number200812 = rand(1);
vector200812 = [rand(1); rand(1); rand(1); rand(1)];
% Operation 3
Year = 2008;
PartOfYear = 2;
PlantType = 1;
string200821 = 'blablabla';
number200821 = rand(1);
vector200821 = [rand(1); rand(1); rand(1); rand(1)];
% Operation 4
Year = 2008;
PartOfYear = 2;
PlantType = 2;
string200822 = 'blablablablubb';
number200822 = rand(1);
vector200822 = [rand(1); rand(1); rand(1); rand(1)];
% Concatenate results
Results = {2008, 1, 1, string200811, number200811;...
2008, 1, 2, string200812, number200812;...
2008, 2, 1, string200821, number200821;...
2008, 2, 2, string200822, number200822}
Table = cell2table(Results);
writetable(Table,'ResultsTest.xls','Sheet',1);
vectors = vertcat(vector200811, vector200812, vector200821, vector200822)
不清楚您是如何初始化每个 "operation" 和存储结果的。您应该 return 一些结构或元胞数组对象。
生成结构的函数:
% Operation x
function myStruct = createStruct()
% ... other functionality here which actually generates the data values
myStruct.Year = 2008;
myStruct.PartOfYear = 2;
myStruct.PlantType = 2;
myStruct.String = 'randomstring';
myStruct.Number = 0.5;
myStruct.Vector = 1:4;
end
然后将所有结构放入元胞数组中
% Generate structs and store in a cell array
myCellArray = cell(4,5);
myVectors = zeros(4,4);
for ii = 1:4
tempStruct = createStruct();
myCellArray{ii, 1} = tempStruct.Year;
myCellArray{ii, 2} = tempStruct.PartOfYear;
myCellArray{ii, 3} = tempStruct.PlantType;
myCellArray{ii, 4} = tempStruct.String;
myCellArray{ii, 5} = tempStruct.Number;
myVectors(ii,:) = tempStruct.Vector;
end
您可以将 createStruct
函数替换为具有类似性质的某些 createCellArray
函数。这将是必须在循环中分配各个字段的快捷方式,但如果您的实际数据更复杂(需要跟踪更多字段),可能会使事情变得不那么清晰。
一般来说,自动命名变量是个坏主意。您可以这样做(例如通过使用 eval
函数),但它笨重、缓慢,并且需要调试问题并且用户无法跟踪变量。将内容存储在通用结构或元胞数组中对于可用性和维护来说要好得多。
我写了一个示例代码来说明我的问题 - 见下文。我有几个操作,每个操作都由不同的服务器独立执行(不仅是示例中的 4 个,而是更多)。我想...
1) 自动命名结果,这样我就可以为更多的年份、部分年份和植物类型命名(例如,当 Year = 2008,PartOfYear = 1 时,将变量命名为 "string200811" , PlantType = 1 等)
2) 也自动连接(如以下代码中的连接)。
如果有任何不清楚的地方,请告诉我!
% Operation 1
Year = 2008;
PartOfYear = 1;
PlantType = 1;
string200811 = 'blabla'; % some random result
number200811 = rand(1); % some other random result
vector200811 = [rand(1); rand(1); rand(1); rand(1)]; % some other random result
% Operation 2
Year = 2008;
PartOfYear = 1;
PlantType = 2;
string200812 = 'blablablubb';
number200812 = rand(1);
vector200812 = [rand(1); rand(1); rand(1); rand(1)];
% Operation 3
Year = 2008;
PartOfYear = 2;
PlantType = 1;
string200821 = 'blablabla';
number200821 = rand(1);
vector200821 = [rand(1); rand(1); rand(1); rand(1)];
% Operation 4
Year = 2008;
PartOfYear = 2;
PlantType = 2;
string200822 = 'blablablablubb';
number200822 = rand(1);
vector200822 = [rand(1); rand(1); rand(1); rand(1)];
% Concatenate results
Results = {2008, 1, 1, string200811, number200811;...
2008, 1, 2, string200812, number200812;...
2008, 2, 1, string200821, number200821;...
2008, 2, 2, string200822, number200822}
Table = cell2table(Results);
writetable(Table,'ResultsTest.xls','Sheet',1);
vectors = vertcat(vector200811, vector200812, vector200821, vector200822)
不清楚您是如何初始化每个 "operation" 和存储结果的。您应该 return 一些结构或元胞数组对象。
生成结构的函数:
% Operation x
function myStruct = createStruct()
% ... other functionality here which actually generates the data values
myStruct.Year = 2008;
myStruct.PartOfYear = 2;
myStruct.PlantType = 2;
myStruct.String = 'randomstring';
myStruct.Number = 0.5;
myStruct.Vector = 1:4;
end
然后将所有结构放入元胞数组中
% Generate structs and store in a cell array
myCellArray = cell(4,5);
myVectors = zeros(4,4);
for ii = 1:4
tempStruct = createStruct();
myCellArray{ii, 1} = tempStruct.Year;
myCellArray{ii, 2} = tempStruct.PartOfYear;
myCellArray{ii, 3} = tempStruct.PlantType;
myCellArray{ii, 4} = tempStruct.String;
myCellArray{ii, 5} = tempStruct.Number;
myVectors(ii,:) = tempStruct.Vector;
end
您可以将 createStruct
函数替换为具有类似性质的某些 createCellArray
函数。这将是必须在循环中分配各个字段的快捷方式,但如果您的实际数据更复杂(需要跟踪更多字段),可能会使事情变得不那么清晰。
一般来说,自动命名变量是个坏主意。您可以这样做(例如通过使用 eval
函数),但它笨重、缓慢,并且需要调试问题并且用户无法跟踪变量。将内容存储在通用结构或元胞数组中对于可用性和维护来说要好得多。