如何通过两个函数(MATLAB)传递可变数量的输出



我试图返回可变数量的输出,但有时这些输出必须通过中介函数传递,有时则不然。这里也提出了类似的问题,但由于没有给出具体的例子,所以没有得到回答。

我正在使用MATLAB内置的传感器数据采集功能,并在手机上不断记录加速度计数据和GPS数据(实际上有7种传感器类型,但我将其简化为2种类型(。这些数据是用唯一的函数检索的。加速度计数据(3个输出阵列(从";accellog";内置功能和GPS数据(7个输出阵列(从"GPS"输出;poslog";内置函数,其中n是测量次数。

我有两个函数用于从这些数据集中提取数据:

函数1:";GetData";从指定的数据集中提取所有数据。字符串";sensorDataString";指定所请求的数据类型(这是必需的,以便可以为不同的传感器通用功能(。

function varargout = GetData(mobileObj, sensorDataString)
switch sensorDataString
case 'Acceleration'
[varargout{1:2}] = accellog(mobileObj);
case 'GPS'
[varargout{1:7}] = poslog(mobileObj);
end
end

功能2:;GetSecondsOfData";基于等待指定的时间量返回数据集的一部分;GetData";函数首先获取数据。

% Return a set of mobile sensor measurements that span the specified number of seconds
function varargout = GetSecondsOfData(mobileObj, sensorDataString, numSeconds)
[tempdata, ~] = GetData(mobileObj, sensorDataString);
startIndx = size(tempdata,1) + 1; % Determine the starting index of measurements
pause(numSeconds) % Collect data for the specified number of seconds
varargout = GetData(mobileObj, sensorDataString);
for i = 1:size(varargout)
varargout{i} = varargout{i}(startIndx:end,:); % Pull out desired section of data
end
end

当试图从"0"分配varargout时发生错误;GetData";以及";GetSecondsOfData";。

是否有一种通用的方法可以从一个函数传递可变数量的输出,然后将这些输出传递给调用函数?(或者有更好的方法来解决这个问题吗?(

我可以使用开关情况结构来确定"开关"中的输出数量;获取数据秒数";功能,但这看起来很混乱的7个传感器。我也可以以不同的形式(单元数组(输出数据,但用varargout输出多个变量是最简单的处理方式,尤其是因为我有时会使用";GetData";并且有时使用";GetSecondsOfData";,所以我必须分配单元格的输出。

如果你知道输出的数量,你可以使用以下代码:

[varargout{1:7}] = poslog(mobileObj);

我正在寻找一种看起来更像这样的东西,其中不必指定单元格的数量:

varargout = GetData(mobileObj, sensorDataString);

好的,这是一个完整的重写,因为上次我似乎不理解你的实际问题。

varargout变量仍在被调用函数中时,它只是一个单元数组。当函数返回时,它只在几个输出中被调度。如果处理可变数量的输出参数会给您带来问题,您可以使用相同的方法来构造输出(单元格数组(,但不要使用varargout,保持单元格数组的原样,这样您就有了固定的输出数量(确实有可变数量的元素,但这不会影响调用函数的方式,只会影响接收数据后解析函数的方式(。

如果你愿意,你可以添加一些可选的输出信息来帮助稍后的解析。

考虑:

function [SensorData, SensorDataInfo] = GetData(mobileObj, sensorDataString)
switch sensorDataString

case 'Acceleration'
nSensors = 2 ;
% Simulate your 2 sensors output: [varargout{1:2}] = accellog(mobileObj);
for k=1:nSensors
SensorData{k} = randi(10,10,1) ;
end

case 'GPS'
nSensors = 7 ;
% Simulate your 7 sensors output: [varargout{1:2}] = poslog(mobileObj);
for k=1:nSensors
SensorData{k} = randi(10,10,1) ;
end
end

if nargout > 1
SensorDataInfo.nSensor    = 7 ;
SensorDataInfo.SensorType = sensorDataString ;
end
end

现在,您可以始终以相同的方式调用函数。对于GPS数据:

>> [SensData , SensInfo] = GetData([], 'GPS')
SensData = 
[10x1 double]    [10x1 double]    [10x1 double]    [10x1 double]    [10x1 double]    [10x1 double]    [10x1 double]
SensInfo = 
nSensor: 7
SensorType: 'GPS'

或加速度计数据:

>> [SensData , SensInfo] = GetData([], 'Acceleration')
SensData = 
[10x1 double]    [10x1 double]
SensInfo = 
nSensor: 2
SensorType: 'Acceleration'

最新更新