- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下图表和创建该图表的数据文件。我想让 Matlab 为我找到以下几点:
是否有任何人们知道的附加工具或软件包可以帮助我完成此任务?我需要为一组绘图执行此操作,因此合理自动化的操作将是理想的。
我当然可以在 Matlab 中完成编程和计算部分,只是能够加载数据文件,将其与曲线或函数匹配,并找到各种 [x,y] 坐标。
最佳答案
好的,开始了。据我所知,Matlab 中没有内置例程来做你想做的事;你必须自己做一个。有几点需要注意:
很明显,线性插值数据最容易实现,应该没有问题
使用单个多项式插值也不难,尽管还有一些细节需要注意。找到峰值应该是首要任务,这涉及到找到导数的根(例如,使用 roots
)。找到峰值后,通过将多项式偏移此量来找到所有所需水平(0%、20%、50%)的多项式的根。
使用三次样条 (spline
) 是最复杂的。对于具有完整三次方的所有子区间,应重复上面概述的一般多项式例程,同时考虑到最大值也可能位于子区间边界上的可能性,并且发现的任何根和极值可能位于区间之外立方体在其上有效(也不要忘记 spline
使用的 x
-offsets)。
这是我对所有 3 种方法的实现:
%% Initialize
% ---------------------------
clc
clear all
% Create some bogus data
n = 25;
f = @(x) cos(x) .* sin(4*x/pi) + 0.5*rand(size(x));
x = sort( 2*pi * rand(n,1));
y = f(x);
%% Linear interpolation
% ---------------------------
% y peak
[y_peak, ind] = max(y);
x_peak = x(ind);
% y == 0%, 20%, 50%
lims = [0 20 50];
X = cell(size(lims));
Y = cell(size(lims));
for p = 1:numel(lims)
% the current level line to solve for
lim = y_peak*lims(p)/100;
% points before and after passing through the current limit
after = (circshift(y<lim,1) & y>lim) | (circshift(y>lim,1) & y<lim);
after(1) = false;
before = circshift(after,-1);
xx = [x(before) x(after)];
yy = [y(before) y(after)];
% interpolate and insert new data
new_X = x(before) - (y(before)-lim).*diff(xx,[],2)./diff(yy,[],2);
X{p} = new_X;
Y{p} = lim * ones(size(new_X));
end
% make a plot to verify
figure(1), clf, hold on
plot(x,y, 'r') % (this also plots the interpolation in this case)
plot(x_peak,y_peak, 'k.') % the peak
plot(X{1},Y{1}, 'r.') % the 0% intersects
plot(X{2},Y{2}, 'g.') % the 20% intersects
plot(X{3},Y{3}, 'b.') % the 50% intersects
% finish plot
xlabel('X'), ylabel('Y'), title('Linear interpolation')
legend(...
'Real data / interpolation',...
'peak',...
'0% intersects',...
'20% intersects',...
'50% intersects',...
'location', 'southeast')
%% Cubic splines
% ---------------------------
% Find cubic splines interpolation
pp = spline(x,y);
% Finding the peak requires finding the maxima of all cubics in all
% intervals. This means evaluating the value of the interpolation on
% the bounds of each interval, finding the roots of the derivative and
% evaluating the interpolation on those roots:
coefs = pp.coefs;
derivCoefs = bsxfun(@times, [3 2 1], coefs(:,1:3));
LB = pp.breaks(1:end-1).'; % lower bounds of all intervals
UB = pp.breaks(2:end).'; % upper bounds of all intervals
% rename for clarity
a = derivCoefs(:,1);
b = derivCoefs(:,2);
c = derivCoefs(:,3);
% collect and limits x-data
x_extrema = [...
LB, UB,...
LB + (-b + sqrt(b.*b - 4.*a.*c))./2./a,... % NOTE: data is offset by LB
LB + (-b - sqrt(b.*b - 4.*a.*c))./2./a,... % NOTE: data is offset by LB
];
x_extrema = x_extrema(imag(x_extrema) == 0);
x_extrema = x_extrema( x_extrema >= min(x(:)) & x_extrema <= max(x(:)) );
% NOW find the peak
[y_peak, ind] = max(ppval(pp, x_extrema(:)));
x_peak = x_extrema(ind);
% y == 0%, 20% and 50%
lims = [0 20 50];
X = cell(size(lims));
Y = cell(size(lims));
for p = 1:numel(lims)
% the current level line to solve for
lim = y_peak * lims(p)/100;
% find all 3 roots of all cubics
R = NaN(size(coefs,1), 3);
for ii = 1:size(coefs,1)
% offset coefficients to find the right intersects
C = coefs(ii,:);
C(end) = C(end)-lim;
% NOTE: data is offset by LB
Rr = roots(C) + LB(ii);
% prune roots
Rr( imag(Rr)~=0 ) = NaN;
Rr( Rr <= LB(ii) | Rr >= UB(ii) ) = NaN;
% insert results
R(ii,:) = Rr;
end
% now evaluate and save all valid points
X{p} = R(~isnan(R));
Y{p} = ppval(pp, X{p});
end
% as a sanity check, plot everything
xx = linspace(min(x(:)), max(x(:)), 20*numel(x));
yy = ppval(pp, xx);
figure(2), clf, hold on
plot(x,y, 'r') % the actual data
plot(xx,yy) % the cubic-splines interpolation
plot(x_peak,y_peak, 'k.') % the peak
plot(X{1},Y{1}, 'r.') % the 0% intersects
plot(X{2},Y{2}, 'g.') % the 20% intersects
plot(X{3},Y{3}, 'b.') % the 50% intersects
% finish plot
xlabel('X'), ylabel('Y'), title('Cubic splines interpolation')
legend(...
'Real data',...
'interpolation',...
'peak',...
'0% intersects',...
'20% intersects',...
'50% intersects',...
'location', 'southeast')
%% (N-1)th degree polynomial
% ---------------------------
% Find best interpolating polynomial
coefs = bsxfun(@power, x, n-1:-1:0) \ y;
% (alternatively, you can use polyfit() to do this, but this is faster)
% To find the peak, we'll have to find the roots of the derivative:
derivCoefs = (n-1:-1:1).' .* coefs(1:end-1);
Rderiv = roots(derivCoefs);
Rderiv = Rderiv(imag(Rderiv) == 0);
Rderiv = Rderiv(Rderiv >= min(x(:)) & Rderiv <= max(x(:)));
[y_peak, ind] = max(polyval(coefs, Rderiv));
x_peak = Rderiv(ind);
% y == 0%, 20%, 50%
lims = [0 20 50];
X = cell(size(lims));
Y = cell(size(lims));
for p = 1:numel(lims)
% the current level line to solve for
lim = y_peak * lims(p)/100;
% offset coefficients as to find the right intersects
C = coefs;
C(end) = C(end)-lim;
% find and prune roots
R = roots(C);
R = R(imag(R) == 0);
R = R(R>min(x(:)) & R<max(x(:)));
% evaluate polynomial at these roots to get actual data
X{p} = R;
Y{p} = polyval(coefs, R);
end
% as a sanity check, plot everything
xx = linspace(min(x(:)), max(x(:)), 20*numel(x));
yy = polyval(coefs, xx);
figure(3), clf, hold on
plot(x,y, 'r') % the actual data
plot(xx,yy) % the cubic-splines interpolation
plot(x_peak,y_peak, 'k.') % the peak
plot(X{1},Y{1}, 'r.') % the 0% intersects
plot(X{2},Y{2}, 'g.') % the 20% intersects
plot(X{3},Y{3}, 'b.') % the 50% intersects
% finish plot
xlabel('X'), ylabel('Y'), title('(N-1)th degree polynomial')
legend(...
'Real data',...
'interpolation',...
'peak',...
'0% intersects',...
'20% intersects',...
'50% intersects',...
'location', 'southeast')
这导致了这三个图:
(请注意,第 (N-1) 次多项式出现问题;20% 的交叉点在最后都是错误的。因此,在复制粘贴之前,请更彻底地检查所有内容:)
正如我之前所说,并且您可以清楚地看到,如果基础数据不适合,使用单个多项式进行插值通常会引入很多问题。此外,正如您从这些图中可以清楚地看到的那样,插值方法对交叉点的位置有很大的影响 - 最重要的是您至少一些想法是您的数据的基础.
对于一般情况,三次样条通常是最好的方法。但是,这是一种通用方法,会让您(以及您出版物的读者)对数据的准确性产生错误的认识。使用三次样条初步了解相交是什么以及它们的行为方式,但一旦真实模型变得更加清晰,请务必返回并重新访问您的分析。当三次样条仅用于通过数据创建更平滑、更具“视觉吸引力”的曲线时,当然不要使用三次样条发布 :)
关于matlab - 在 Matlab 中沿着绘图查找点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15876539/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!