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,则该方法应该更快