MATLAB使用crossval有相同行数仍然报错行数不符

昨天使用matlab编写了一个用于计算我的实验数据的代码,运行的时候遇到了难以理解提问ai也不能解决的问题,情况如下:

img


但我的代码在运行停止的部分可以清晰的看到X和Y的行数相同:

img


原代码如下:

clear
clc
OS='F:\Red Soil\江西\';
[a,R]=geotiffread(strcat(OS,'GPP\GPP_Mon_2001_1.tif'));  
info=geotiffinfo(strcat(OS,'GPP\GPP_Mon_2001_1.tif'));
[m,n]=size(a);
ncomps=1:3;  %要测试的主成分数
outRaster = zeros(m,n); %输出栅格
sample_idx = randi([1 m],500,2); % 350个随机采样坐标
%% 定义栅格数据文件路径
GPPpath=strcat(OS,'GPP\');
PREpath=strcat(OS,'PRE\');
TEMpath=strcat(OS,'TEM\');
DTRpath=strcat(OS,'DTR\');
%% 指定处理的文件
GPPfiles=dir([GPPpath,'*.tif']);
PREfiles=dir([PREpath,'*.tif']);
TEMfiles=dir([TEMpath,'*.tif']);
DTRfiles=dir([DTRpath,'*.tif']);

%% 主循环
Y=[];
X=[];
for n = 1:size(sample_idx,1)
    i = sample_idx(n,1);
    j = sample_idx(n,2);
       for year=2001:2019  %筛选年份
           for month=1:12  %筛选月份
        gpp=importdata([GPPpath,'GPP_Mon_',int2str(year),'_',int2str(month),'.tif']);
        pre=importdata([PREpath,int2str(year),'_',int2str(month),'_pre','.tif']);
        tem=importdata([TEMpath,int2str(year),'_',int2str(month),'_tem.tif']);
        dtr=importdata([DTRpath,int2str(year),'_',int2str(month),'_dtr','.tif']);
            y=gpp(i,j);
            x=[pre(i,j),tem(i,j),dtr(i,j)];
            Y = [Y; y]; 
            X = [X; x];
            if size(Y,1)==228
                %X=single(X);
                %Y=single(Y);
                disp(size(X));
                disp(size(Y));
                [best_ncomps, RMSE] = find_best_ncomps(X,Y,ncomps);
                outRaster(i,j) = best_ncomps; 
                [XL,YL,XS,YS,beta,PCTVAR] = plsregress(X,Y,best_ncomps);
                X = [];
                Y = [];
            end
            end
        end
end

% 模型评估
ypred = XL*beta;
rmse = rms(y - ypred); 
r2 = corrcoef(y, ypred).^2;
out = outRaster(sample_idx); % 采样点结果
geotiffwrite(out,'F:\Red Soil\江西\best_ncomps.tif')

其中加入的筛选最佳值的函数:

function [best_ncomps,RMSE] = find_best_ncomps(X,Y,ncomps)

% 输入:
% X: 自变量数据
% Y: 依变量目标
% ncomps: 要测试的主成分数向量

% 输出:
% best_ncomps: 最佳主成分数
% RMSE: 每个主成分数下的交叉验证RMSE

RMSE = zeros(size(ncomps));

for i = 1:length(ncomps)

    % PLS建模
    [XL,YL,XS,YS,beta,PCTVAR] = plsregress(X,Y,ncomps(i));
    
    % 20折交叉验证
    cv = cvpartition(size(X,1),'HoldOut',0.05); 
    ypred = crossval(@plsregress,X,Y,ncomps(i),'cv',cv);
    
    % 计算RMSE
    RMSE(i) = rms(Y-ypred);
    
end

[minRMSE,idx] = min(RMSE);
best_ncomps = ncomps(idx);

end

我很不理解这是出现了什么情况?查询的结果说是可能matlab除了bug。目前使用的matlab版本是2022a,先前在运行其他代码时不存在这类问题,还请帮忙看一看是什么原因,刚入门一点,是和ai配合着写的,有什么问题还请直言不讳,非常需要帮助,感激不尽。

【以下回答由 GPT 生成】

问题原因是在使用crossval函数时,X和Y的行数需要一致,但根据你提供的代码,X和Y并没有被输入crossval函数,因此无法确定问题的具体原因。不过,你可以检查以下几个可能的错误:

  1. 检查你使用crossval函数的部分,确保在该部分没有引入其他变量。

  2. 确保在跑出错误前,X和Y的行数确实是相同的。你可以添加一些输出语句(如disp)来验证。

  3. 如果你之前对X和Y进行了某些修改(如删除一些行),那么可能导致行数不一致。你可以打印出X和Y的行数,以确认它们是否相同。

如果以上检查都没有找到问题所在,你可以提供更多的代码和错误信息来帮助我们更好地理解问题,并为你提供更准确的解决方案。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^