You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Octave技术问题:调整metrics矩阵存储结构,使j对应行、k对应列

解决MATLAB矩阵存储格式问题

问题描述

现有双层循环代码用于计算统计量并存入metrics矩阵,数值结果正确,但存储格式不符合需求:当前数据按4维数组存储,希望j=1时k=1:19的结果存入第一行,j=2时存入第二行,以此类推,每行对应一个j值,包含该j下所有k的8个统计量。

用户原代码:

for j = 1:20
    for k = 1:19
        metrics(i,1,j,k) = max(patient1(:,j,k)); %Max value
        metrics(i,2,j,k) = min(patient1(:,j,k)); %Min value
        metrics(i,3,j,k) = mean(patient1(:,j,k)); %Mean value
        metrics(i,4,j,k) = std(patient1(:,j,k)); %Std value
        metrics(i,5,j,k) = var(patient1(:,j,k)); %Variance value
        metrics(i,6,j,k) = kurtosis(patient1(:,j,k)); %Kurtosis value
        metrics(i,7,j,k) = skewness(patient1(:,j,k)); %Skewness value
        metrics(i,8,j,k) = peak2peak(patient1(:,j,k)); %Peak to peak value
    end
end

解决方案

方案1:直接在循环中写入二维矩阵

初始化二维矩阵,按行j、列(k对应的统计量组)直接写入,无需后续维度调整:

% 初始化二维metrics:20行(对应j=1~20),19*8=152列(每个k对应8个统计量)
metrics = zeros(20, 19*8);

for j = 1:20
    for k = 1:19
        % 一次性计算当前k对应的8个统计量
        current_stats = [
            max(patient1(:,j,k)),
            min(patient1(:,j,k)),
            mean(patient1(:,j,k)),
            std(patient1(:,j,k)),
            var(patient1(:,j,k)),
            kurtosis(patient1(:,j,k)),
            skewness(patient1(:,j,k)),
            peak2peak(patient1(:,j,k))
        ];
        % 将统计量写入第j行的对应列区间
        metrics(j, (k-1)*8 + 1 : k*8) = current_stats;
    end
end

方案2:转换现有4维数组为目标格式

如果已经运行原代码得到4维metrics,可通过维度重塑调整格式(假设i为固定单值):

% 提取固定i对应的切片,移除长度为1的维度
temp = squeeze(metrics(i,:,:,:));
% 调整维度顺序并重塑为二维矩阵
metrics_2d = reshape(permute(temp, [3,2,1]), 20, []);

解释:

  • squeeze将原4维数组(1,8,20,19)转为3维(8,20,19);
  • permute把维度顺序调整为(20,19,8),对应j行、k组、统计量;
  • reshape合并后两个维度,最终得到20行、152列的二维矩阵。

内容的提问来源于stack exchange,提问作者kostasmath23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:38:14