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
相关产品推荐
相关产品推荐

