Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何使用函数返回值作为矩阵行?_Matlab_Matrix - Fatal编程技术网

Matlab 如何使用函数返回值作为矩阵行?

Matlab 如何使用函数返回值作为矩阵行?,matlab,matrix,Matlab,Matrix,我试图绘制函数返回值,一个基于另一个。我的函数定义是: function [final_speed, voltage] = find_final_speed(simulink_output) 如您所见,它返回两个变量。我需要一个如下所示的矩阵: final_speed_1 voltage_1 final_speed_2 voltage_1 final_speed_3 voltage_1 final_speed_4 voltage_1 final_speed_5 voltag

我试图绘制函数返回值,一个基于另一个。我的函数定义是:

function [final_speed, voltage] = find_final_speed(simulink_output)
如您所见,它返回两个变量。我需要一个如下所示的矩阵:

final_speed_1   voltage_1
final_speed_2   voltage_1
final_speed_3   voltage_1
final_speed_4   voltage_1
final_speed_5   voltage_1
Data  = [DATA_1, DATA_2,....DATA_N] ;
outMat = [] ; 
for i = 1 : length (Data)
 [s v] = find_final_speed(Data(i));
 outMat  = [outMat ; s,v]
end
最后,电压应绘制在X轴上,速度应绘制在Y轴上

我最初试过这个:

speedpervoltage = [find_final_speed(DATA_1); find_final_speed(DATA_2); ... ];
但这只会导致这个矩阵,所有的电压信息都消失了:

final_speed_1
final_speed_2
...
在所有谷歌搜索和尝试失败后,我做了以下几点:

[s1 v1] = find_final_speed(DATA_1);
[s2 v2] = find_final_speed(DATA_2);
[s... v...] = find_final_speed(DATA_...);

speedpervoltage = [0 0;s1 v1;s2 v2;s... v....;];
% Just contains the figure call along with graph properties.
plot_speedpervoltage(speedpervoltage);
这确实不是最佳或实际的解决方案。如何更动态地执行此操作?理想情况下,我希望函数
create\u speedpervoltage
,它将数据矩阵数组作为参数:

plot_speedpervoltage(create_speedpervoltage([DATA_1 DATA_2 ...]));

如果您知道有多少数据集,可以将所有内容封装在for循环中,如下所示:

final_speed_1   voltage_1
final_speed_2   voltage_1
final_speed_3   voltage_1
final_speed_4   voltage_1
final_speed_5   voltage_1
Data  = [DATA_1, DATA_2,....DATA_N] ;
outMat = [] ; 
for i = 1 : length (Data)
 [s v] = find_final_speed(Data(i));
 outMat  = [outMat ; s,v]
end

在Matlab中有一种简单的方法可以实现这一点。此答案与User1551892的答案不同,因为它不会动态重新分配变量,从而提高性能。代码如下

% Declare Return Vectors
final_speed = zeros(20,1);
voltage = zeros(20,1);

% Loop through each data point
for i = 1: length( data )
    [final_speed(i,:),voltage(i,:)] = find_final_speed( data(i) );
end
现在假设数据是一个向量,每个元素对应于最终速度和电压速度

编辑:

另一种提高速度的方法是使用
arrayfun
。假设您的数据是1D,通过将函数作为句柄输入arrayfun,您可以使用此行替换3行循环,并使用此代码进行预分配,这将为您提供更好的性能,和更少的行

[final_speed,voltage] = arrayfun( @find_final_speed, data );

下面是cellfun的解决方案

[s, v] = cellfun(@find_final_speed, [{DATA_1}, {DATA_2},... {DATA_N}]);
speedpervoltage = [s(:) v(:)];

我不确定你们想要什么,但若你们想从函数中得到两个输出参数,那个就很容易了。编写一个函数:
function[a,b]=test()a=randi(10[101]);b=randi(10[101]),然后将其称为
[a,b]=test()
。您将获得
a
b
作为
10x1
数组。然后您可以将它们绘制为
plot(a,b)[s1 v1]=查找最终速度(数据1)不,我不难注意到这一点。然而,我确实注意到了以下几点。将函数头正确写入
函数[final\u speed,voltage]=find\u final\u speed(simulink\u输出)
。然后只使用输出参数调用它:
speedpervoltage=[find_final_speed(数据_1);find_final_speed(数据_2);…]。这就是为什么你只得到spped而没有电压。谢谢你的帮助!:)我很惊讶Matlab没有本地的方法来处理这个问题。嘿,Tomas,你应该用我的实现来代替。与此相比,您可以获得更快的性能我还将向您展示
arrayfun
方法,如果
data
为1D,则该方法应该更快