qq_52830565 2024-01-15 21:07 采纳率: 50%
浏览 13
已结题

盒子分形维数的最大尺寸怎么定

盒子分形维数的盒子最大尺寸怎么取,比如下边代码,盒子最大尺寸cellmax输入值越大,输出值不断变化,多组数组大小不一致,各自求取分形维数对比怎么决定这个盒子最大边长cellmax?下附代码和1.dat,其他数组也是这种无序的,但长度会有10以内的差异

103.8
7.2
7.3
1
8
8.8
2.8
5
4.55
2.17
2.32
6.78
0.33
1.21
1.87
16.32
1.85
5.3
4.05
1.88
3.44
11.37
6.62
2.85
2.44
1.87
1.8
3.18
2
3.7
5
2.22
5.93
3.2
10.75
5.8
43.58


%根据计盒维数原理编写了求一维曲线分形维数的matlab程序 
 
function D=FractalDim(y,cellmax)

%求输入一维信号的计盒分形维数
%y是一维信号
%cellmax:方格子的最大边长,可以取2的偶数次幂次(1,2,4,8...),取大于数据长度的偶数
%D是y的计盒维数(一般情况下D>=1),D=lim(log(N(e))/log(k/e)),
y=load('1.dat');
%y=[1,1,5,1,1,5];

cellmax=64;

if cellmax<length(y)
error('cellmax must be larger than input signal!')
end
L=length(y);%输入样点的个数
y_min=min(y);

%移位操作,将y_min移到坐标0点
y_shift=y-y_min;
%重采样,使总点数等于cellmax+1
x_ord=[0:L-1]./(L-1);
xx_ord=[0:cellmax]./(cellmax);
y_interp=interp1(x_ord,y_shift,xx_ord);
%按比例缩放y,使最大值为2^^c
ys_max=max(y_interp);
factory=cellmax/ys_max;
yy=abs(y_interp*factory);

t=log2(cellmax)+1;%叠代次数
for e=1:t
Ne=0;%累积覆盖信号的格子的总数
cellsize=2^(e-1);%每次的格子大小
NumSeg(e)=cellmax/cellsize;%横轴划分成的段数

for j=1:NumSeg(e) %由横轴第一个段起通过计算纵轴跨越的格子数累积N(e) 
begin=cellsize*(j-1)+1;%每一段的起始
tail=cellsize*j+1;
seg=[begin:tail];%段坐标
yy_max=max(yy(seg));
yy_min=min(yy(seg));
up=ceil(yy_max/cellsize);
down=floor(yy_min/cellsize);
Ns=up-down;% 本段曲线占有的格子数
Ne=Ne+Ns;%累加每一段覆盖曲线的格子数

end

N(e)=Ne;%记录每e下的N(e) 
end

%对log(N(e))和log(k/e)进行最小二乘的一次曲线拟合,斜率就是D

r=-diff(log2(N));%去掉r超过2和小于1的野点数据
id=find(r<=2&r>=1);%保留的数据点
Ne=N(id);
e=NumSeg(id);

P=polyfit(log2(e),log2(Ne),1);%一次曲线拟合返回斜率和截距
D=P(1); 


  • 写回答

11条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-15 21:08
    关注

    引自免费微信小程序:皆我百晓生

    盒子分形维数的最大尺寸取决于输入信号的数据长度以及计算能力的限制。一般来说,盒子分形维数的最大尺寸应该小于等于输入信号的数据长度,以确保能够覆盖整个信号。当盒子最大尺寸cellmax大于输入信号的数据长度时,会出现数组大小不一致的问题。

    解决这个问题的方法可以有两种:

    1. 对输入信号进行截断或采样:

    • 可以根据输入信号的数据长度,选择合适的cellmax值,使其小于等于输入信号的数据长度。
    • 如果cellmax的值大于输入信号的数据长度,可以将输入信号进行截断或采样,以保证cellmax值小于等于输入信号的数据长度。

    2. 动态调整cellmax的值:

    • 可以在程序中进行判断,当cellmax大于输入信号的数据长度时,自动将cellmax的值调整为输入信号的数据长度。可以使用条件语句来实现这个功能。

    下面是修改后的代码示例,以实现动态调整cellmax的值:

    function D=FractalDim(y,cellmax)
        y=load('1.dat');
        % y=[1,1,5,1,1,5];
        
        L=length(y); % 输入样点的个数
        y_min=min(y);
        y_shift=y-y_min;
        x_ord=[0:L-1]./(L-1);
        xx_ord=[0:min(cellmax, L-1)]./(min(cellmax, L-1));
        y_interp=interp1(x_ord,y_shift,xx_ord);
        ys_max=max(y_interp);
        factory=min(cellmax, L-1)/ys_max;
        yy=abs(y_interp*factory);
        
        t=log2(min(cellmax, L-1))+1;%叠代次数
        
        for e=1:t
            Ne=0;%累积覆盖信号的格子的总数
            cellsize=2^(e-1);%每次的格子大小
            NumSeg(e)=min(cellmax, L-1)/cellsize;%横轴划分成的段数
        
            for j=1:NumSeg(e) %由横轴第一个段起通过计算纵轴跨越的格子数累积N(e) 
                begin=cellsize*(j-1)+1;%每一段的起始
                tail=cellsize*j+1;
                seg=[begin:tail];%段坐标
                yy_max=max(yy(seg));
                yy_min=min(yy(seg));
                up=ceil(yy_max/cellsize);
                down=floor(yy_min/cellsize);
                Ns=up-down;% 本段曲线占有的格子数
                Ne=Ne+Ns;%累加每一段覆盖曲线的格子数
            end
        
            N(e)=Ne;%记录每e下的N(e) 
        end
    
        %对log(N(e))和log(k/e)进行最小二乘的一次曲线拟合,斜率就是D
        r=-diff(log2(N));%去掉r超过2和小于1的野点数据
        id=find(r<=2&r>=1);%保留的数据点
        Ne=N(id);
        e=NumSeg(id);
    
        P=polyfit(log2(e),log2(Ne),1);%一次曲线拟合返回斜率和截距
        D=P(1);
    end
    

    这样修改后的代码会在计算计盒维数时,判断cellmax是否大于输入信号的数据长度,并自动调整为输入信号的数据长度。这样可以避免数组大小不一致的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 修改了问题 1月16日
  • 修改了问题 1月15日
  • 展开全部

悬赏问题

  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红