我需要在数据集上实现均值过滤器,但我无法访问信号处理工具箱.有没有办法在不使用for循环的情况下执行此操作?这是我工作的代码:
x=0:.1:10*pi;
noise=0.5*(rand(1,length(x))-0.5);
y=sin(x)+noise; %generate noisy signal
a=10; %specify moving window size
my=zeros(1,length(y)-a);
for n=a/2+1:length(y)-a/2
my(n-a/2)=mean(y(n-a/2:n+a/2)); %calculate mean for each window
end
mx=x(a/2+1:end-a/2); %truncate x array to match
plot(x,y)
hold on
plot(mx,my,'r')
Run Code Online (Sandbox Code Playgroud)
编辑:
在实现merv解决方案后,内置滤波器方法滞后于原始信号.有没有解决的办法?

有谁知道在MATLAB gui中显示弹出日期选择日历的方法?我知道金融工具箱有一个uicalendar功能,但不幸的是我没有那个工具箱.
我有预感我将不得不使用一些Java或其他语言来做这个,我对此一无所知.
我正在寻找类似的东西: alt text http://www.welie.com/patterns/images/date-selector-expedia-small.png
在用户选择日期后返回日期字符串.
有没有一种简单的方法可以在较大的字符串中找到较小的字符串数组?我有两个列表,一个有独特元素,另一个有重复元素.我想在较大的数组中找到较小数组的特定模式的全部出现.我知道strcmp会比较两个单元格数组,但前提是它们的长度相等.我的第一个想法是使用循环遍历较大阵列的子集,但必须有一个更好的解决方案.
例如,在以下内容中:
smallcellarray={'string1',...
'string2',...
'string3'};
largecellarray={'string1',...
'string2',...
'string3',...
'string1',...
'string2',...
'string1',...
'string2',...
'string3'};
index=myfunction(largecellarray,smallcellarray)
Run Code Online (Sandbox Code Playgroud)
会回来的
index=[1 1 1 0 0 1 1 1]
Run Code Online (Sandbox Code Playgroud) 我有一个txt文件,文件的内容是数字行,每行有5个浮点数,每个数字之间用逗号分隔.例:
1.1,12,1.42562,3.5,2.2
2.1,3.3,3,3.333,3.75
如何在matlab中将文件内容读入矩阵?到目前为止我有这个:
fid = fopen('file.txt');
comma = char(',');
A = fscanf(fid, ['%f', comma]);
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
问题是它只给我第一行,当我尝试写AI的内容时得到这个:1.0e + 004*一些数字
有谁可以帮助我吗?我想对于文件我需要在循环中读取它,但我不知道如何.
编辑:还有一个问题:当我输出AI时,得到这个:
A =
1.0e+004 *
4.8631 0 0 0 0.0001
4.8638 -0.0000 -0.0000 0.0004 0.0114
4.8647 -0.0000 -0.0000 0.0008 0.0109
Run Code Online (Sandbox Code Playgroud)
我想要文件中的相同值在矩阵中,如何使数字成为常规浮点数而不是像这样格式化?或者矩阵中的数字是否实际浮动,但输出只是这样显示?
我试图用一个标有'R:...,Theta:...'的数据提示来注释一个极地情节,其中theta实际上是希腊符号,而不是拼出的单词.我熟悉使用'\ theta'生成符号的字符串格式,但在这种情况下它不起作用.有没有办法将LaTeX解释器应用于数据提示?这是我到目前为止所拥有的:
f1=figure;
t=pi/4;
r=1;
polar(t,r,'.');
dcm_obj = datacursormode(f1);
set(dcm_obj,'UpdateFcn',@polarlabel)
info_struct = getCursorInfo(dcm_obj);
datacursormode on
Run Code Online (Sandbox Code Playgroud)
其中polarlabel的定义如下:
function txt = polarlabel(empt,event_obj)
pos = get(event_obj,'Position');
x=pos(1);
y=pos(2);
[th,r]=cart2pol(x,y);
txt = {['R: ',num2str(r)],...
['\Theta: ',num2str(th*180/pi)]};
Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题,但谷歌和MATLAB文档让我失望.我有一个相当大的二进制文件(> 10 GB),我需要打开并删除最后四千万字节左右.有没有办法在不将整个文件读取到内存并将其打印到新文件的情况下执行此操作?生成文件花了6个小时,所以我想重新阅读整个文件.
编辑:
该文件的大小为14,440,000,000字节.我需要把它砍成14,400,000,000.
我有一个GUI,它使用另一个回调中弹出菜单的选择.有没有办法只在一行中返回弹出菜单的选定值而不创建任何临时变量?我已经尝试了几种解决方案,但我只使用一个临时变量管理了两行:
三行:
list=get(handles.popupmenu1,'String');
val=get(handles.popupmenu1,'Value');
str=list{val};
Run Code Online (Sandbox Code Playgroud)
两行:
temp=get(handles.popupmenu1,{'String','Value'});
str=temp{1}{temp{2}};
Run Code Online (Sandbox Code Playgroud)
任何人都可以把它剃成一个吗?
PS,这是一个动态菜单,所以我不能只使用get(handles.popupmenu1,'Value')和忽略字符串组件.
我正在尝试从MATLAB FEX 实现datetick2的修改版本.当绘图在较小的日期范围内放大时,日期/月/年等不会显示,具体取决于绘图中的时间范围.我想在图的左下角放置一个'dd-mmm-yyyy'格式的开始日期作为注释.没问题,已经完成了.
但是,如果用户使用缩放功能选择不同的日期范围,接下来我想让它更新.我想要找到注释,而不是传递更多的句柄.然而,findobj似乎不适用于hggroup类型,这是注释的范畴.我用错了吗?
这是一个代码示例:
>> times=now-[50:-5:0];
>> days=times-times(1);
>> plot(times,days)
>> datetick2()
>> xlabel('Date')
>> ylabel('Days')
>> title('Example')
>> initialdate=datestr(min(get(gca,'xlim')),'dd-mmm-yyyy');
>> txt=annotation('textbox', [.01,.01,.1,.05],...
'string', initialdate,...
'Linestyle','none');
>>
>>
>> findobj('type','hggroup')
ans =
Empty matrix: 0-by-1
>> get(txt,'type')
ans =
hggroup
>> findobj('type','axes')
ans =
270.0034
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,findobj不起作用,但如果我使用我在工作区中定义的句柄,则该类型会弹出hggroup.
我有一个结构数组包含字段作为不同长度的结构数组.例如:
's'是一个结构'data'是's'中的一个字段,也是一个结构数组本身和
length(s(n).data) ~= length(s(m).data)
Run Code Online (Sandbox Code Playgroud)
我想预先分配一个数组,该数组从每个字段s.data.timestamp中获取一个时间戳.有没有办法在不使用for循环两次的情况下执行此操作?这是我到目前为止:
% find the total length
count=0;
for x=1:length(s)
count=count+length(s(x).data);
end
% preallocate timestamp array
timestamp=zeros(1,count);
% populate timestamp array
index=1;
for x=1:length(s)
for y=1:length(s(x).data)
timestamp(index)=s(x).data(y).timestamp;
index=index+1;
end
end
Run Code Online (Sandbox Code Playgroud)
我想过根据's'的长度和'数据'的平均长度过高估计我需要的长度,但每个'数据'字段/子结构的实际长度变化很大.我是否会更好地过高估计它的结果并在之后修剪得到的数组?使用我正在使用的数据集时,零时间戳是不可能的,所以这应该不是问题.
我试图在MATLAB中输出一个数字数组作为字符串.我知道这很容易使用num2str,但我想要逗号后跟一个空格来分隔数字,而不是制表符.数组元素最多只有十分之一的分辨率,但大多数都是整数.有没有办法格式化输出,以便不必要的尾随零?这就是我设法组建的内容:
data=[2,3,5.5,4];
datastring=num2str(data,'%.1f, ');
datastring=['[',datastring(1:end-1),']']
Run Code Online (Sandbox Code Playgroud)
它给出了输出:
[2.0, 3.0, 5.5, 4.0]
Run Code Online (Sandbox Code Playgroud)
而不是:
[2, 3, 5.5, 4]
Run Code Online (Sandbox Code Playgroud)
有什么建议?
编辑:我刚刚意识到我可以strrep通过调用来解决这个问题
datastring=strrep(datastring,'.0','')
Run Code Online (Sandbox Code Playgroud)
但这似乎比我一直在做的更加笨拙.
我正在尝试将 .xlsx 文件中存储的一些数据读入 MATLAB。但是,使用 xlsread 返回一个空数据集。
data = xlsread('myFile.xlsx');
Run Code Online (Sandbox Code Playgroud)
工作表名称是标准的“Sheet1”,所以我知道它没有寻找错误的工作表。
我什至检查以确保文件存在,并尽可能使用 uigetfile 来确保路径和字符串名称正确:
[fileName,dirName]=uigetfile('.xlsx');
data = xlsread(fullfile(dirName,fileName));
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?