【问题标题】:Undefined function 'minus' for input argument of type 'iddata''iddata' 类型的输入参数的未定义函数 'minus'
【发布时间】:2018-02-07 00:36:54
【问题描述】:

这是a previous issue I was having 的后续。

我想给信号一个偏移量,然后在其中添加一些延迟并为此计算 RMSE,但是在取差时我遇到了以下问题:

我想问以下问题:

  1. 如何解决上述问题?
  2. 请用简单的语言解释一下iddata 的作用 - 因为我研究了包括 MATLAB 在内的不同门户网站,但仍然无法获得一个好的概念。
  3. 如何将iddata 类型的数据存储在单元格中,以便在代码的最后部分进行减法?

有问题的代码:

 drv(1)=load('123.mat');

 t = drv(1).x;
 ref = drv(1).y;
 angle = drv(1).z;
 Fs = 1000;              
 t1 =t';
 ref1= ref';
 d_data = iddata(ref1, t1, 1/Fs);

 %% Add offset:
 x = 1;
 afterOffset1= {};
 for i = 100:10:130 
 T = getTrend(d_data); 
 % <detrend data if needed>
 T.InputOffset = i;
 T.OutputOffset = i;
 afterOffset = retrend(d_data,T);
 afterOffset1{x,1}= afterOffset;
 x= x+1 ;
 end 

 %% Add delay:
 y=20;
 afterDelay1= {};
 for i = 1:1:4
 % delaySamples = i; % Must be a non-negative value
 % afterDelay = iddata([NaN(delaySamples,1); d_data.OutputData],...
 %                     [d_data.InputData; NaN(delaySamples,1)], 1/Fs);
 afterOffset1{i}.Tstart = y;
 afterDelay1{i,1}= afterOffset1{i};
 y= y+10;
 end 
 %% Plot:
 n = size(afterDelay1,1);
 figure();
 for i=1:1:n
 subplot(2,2,i);

 plot(d_data);
 hold all
 plot(afterDelay1{i});
 end

 sig_diff = angle(1)-afterDelay1;
 square_error(i,:) = (sig_diff(i)).^2;
 mse(i,:)=  mean(square_error(i));
 rmse(i,:) = sqrt(mse(i));


 sig_diff = d_data_1 - afterDelay; %        <<<<<<<<<<<<<<<<<<<<<< Problem is here
 %     square_error = (sig_diff).^2;
 %     mse=  mean(square_error);
 %     rmse = sqrt(mse);
 end

【问题讨论】:

  • rayryeng 我已经安装了系统识别工具箱。我在这一行有问题 sig_diff = angle(1)-afterDelay1;实际上我想从矩阵中减去 iddata 这可能是一个问题。
  • 非常感谢 Dev-iL 编辑我的问题。
  • 我误读了这个问题。道歉。我已经创建了一个答案。

标签: matlab methods time-series signal-processing sampling


【解决方案1】:

您很可能想要来自iddata 对象的OutputData 属性,它是您问题的输出或y 信号:

sig_diff = angle(1)-afterDelay1.OutputData;

还请注意,这将为您提供一个 column 向量,但您的代码稍后会假定它是一个行向量。在执行上述计算后,您可能需要转置这些数据,然后再继续:

sig_diff = angle(1)-afterDelay1.OutputData;
sig_diff = sig_diff.';

一般来说,iddata 是一个函数,它创建一个表示输入和输出时域或频域数据的对象。请注意,当您创建 iddata 对象时,输入矩阵可能有多个源,因此每个 column 都指示一个源。对于每个 column 指示输出的输出也可以这样说。因此,在使用此函数之前转置数据非常重要,以确保每个信号位于单独的列中,或者仅使用单个列来表示一个输入/输出。

对象内部具有多种属性,包括采样时间或采样频率、函数所承担的有效域和范围以及最终访问输入和输出数据。 OutputData 是这些字段之一。我建议您查看有关您可以使用iddata 访问的所有属性的文档。 OutputData 在这里明确定义:https://www.mathworks.com/help/ident/ref/iddata.html

【讨论】:

  • rayryeng 。非常感谢它对我很有用,也感谢你对 iddata 的解释。系统识别工具箱对我这样的初学者来说很好的解释。
  • 只有一个问题 outdata = afterDelay1.OutputData 。当我使用此命令时,它将 3D 数据转换为 2D 我很困惑它是如何完成的,因为 outdata 也应该包含 3D 。你能解决我的这个困惑吗?提前致谢。
  • @Peter 我不太确定我是否跟随。我没有意识到您的输入是 3D 数据。你能给我更多关于你的输入和输出数据是什么样子的信息吗?更好的是,如果您可以上传您的 MAT 文件的副本,我会很高兴,这样我可以自己查看。我可以更轻松地修改我的帖子,因为我将能够在上面运行您的代码。
  • MATLAB 中不存在矩阵上的尾随单例维度。你的意思是它是一个 1 x 1 x 166230 矩阵?
  • rayryeng 真的很抱歉我的错误我明白了。非常感谢您的大力帮助和支持。
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 2014-10-24
  • 2015-05-28
  • 2020-07-20
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多